<?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>DEV Community: Makanju Oluwafemi</title>
    <description>The latest articles on DEV Community by Makanju Oluwafemi (@miracool).</description>
    <link>https://dev.to/miracool</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F628059%2Fe5da7c2a-8dd4-4559-af13-0997e018ee5f.jpg</url>
      <title>DEV Community: Makanju Oluwafemi</title>
      <link>https://dev.to/miracool</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miracool"/>
    <language>en</language>
    <item>
      <title>5 Red Flags Your AI-Generated Code Needs a Second Look</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Fri, 24 Jul 2026 11:47:49 +0000</pubDate>
      <link>https://dev.to/scanaislop/5-red-flags-your-ai-generated-code-needs-a-second-look-bp3</link>
      <guid>https://dev.to/scanaislop/5-red-flags-your-ai-generated-code-needs-a-second-look-bp3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The speed of execution is what makes AI great these days the ability to generate code or entire features that would normally take a full day,in a few minutes of prompting. That's incredible, in the grand scheme of things.&lt;/p&gt;

&lt;p&gt;What differentiates a senior engineer from a junior one is the sheer willingness to dig deeper into code to review it, question it, and spot issues before it ever gets merged into production. But that instinct comes with experience. Senior developers have seen patterns before. They know how to properly handle exceptions, where systems tend to break, and what "clean" actually looks like versus what just looks clean.&lt;/p&gt;

&lt;p&gt;Right now, AI has broken down the barrier to entry for software engineering. Folks without any coding background can spin up a real product using nothing but natural language and an LLM at the core. That's genuinely exciting. But what most people don't know and don't think to ask is whether what the AI built can actually scale, hold up under real usage, or survive contact with an edge case it wasn't shown.&lt;/p&gt;

&lt;p&gt;I put together 5 red flags you need to look out for in AI-generated code. This is useful whether you're a mid-level developer leaning on AI to move faster, or a product owner shipping with AI as your primary engineering resource.&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;As a senior engineer reading this, i beleive all of the issue mentioned in this post should not be obscure to you. &lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Hallucinated Dependencies &amp;amp; APIs
&lt;/h3&gt;

&lt;p&gt;LLMs hallucinate a lot  especially when you don't give them full context of what you're building, or when you let them guess at the rest. You'll eventually see things like a random import sitting at the top of your file that doesn't actually do anything, or a function call to a method that doesn't exist in the package you're using, or an API endpoint the AI simply assumed was there.&lt;/p&gt;

&lt;p&gt;It's important that you track all of this closely, to make sure your system stays consistent with the actual imports, packages, and API URLs you depend on not the ones the LLM confidently invented. A five-second check now saves you a broken build later, usually at the worst possible time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to catch it:&lt;/strong&gt; Verify every import and API call against the actual documentation before you merge. Run a build or install step immediately after generation if a package doesn't exist, you want that to fail loudly right away, not three commits deep when it's tangled into everything else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inconsistent or Contradictory Logic
&lt;/h3&gt;

&lt;p&gt;This one is sneakier, because the code often reads fine line by line. Each individual statement looks reasonable. It's only when you trace the logic end-to-end that you notice it doesn't actually hold together a variable gets reassigned in a way that quietly breaks an earlier assumption, a conditional branch that can never actually be reached, or two functions that handle the exact same case in two different, contradicting ways.&lt;/p&gt;

&lt;p&gt;This happens because LLMs generate code the way they generate text one plausible piece at a time, without always holding the full picture in mind. It can produce something that's locally correct but globally broken, and that kind of bug is exactly the one that slips past a quick glance and shows up in production three weeks later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to catch it:&lt;/strong&gt; Trace the logic manually, or step through it with a debugger, before you trust it with anything important. A trick that works well here: ask the AI to explain its own logic back to you, step by step. If the explanation doesn't hold up on its own, the code underneath it probably doesn't either.&lt;/p&gt;

&lt;h3&gt;
  
  
  Silent Security Gaps
&lt;/h3&gt;

&lt;p&gt;AI-generated code has a habit of optimizing for "it works," not "it's safe." That usually means missing input validation, hardcoded secrets sitting right there in plain text, or unsafe defaults that quietly work fine in development and become a real liability the moment real users touch the system.&lt;/p&gt;

&lt;p&gt;The dangerous part isn't that these gaps exist, it's that they're silent. Nothing throws an error. Nothing fails a build. The code runs perfectly, right up until someone finds the gap, and it's rarely going to be you who finds it first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to catch it:&lt;/strong&gt; Make a security linter or scanner a standard part of your workflow, not an optional extra step. Never accept a hardcoded secret in code, no matter how "temporary" it's meant to be. And be deliberate about asking the AI directly: Does this handle untrusted input? What happens if this value is empty, malformed, or malicious?&lt;/p&gt;

&lt;h3&gt;
  
  
  Missing or Superficial Test Coverage
&lt;/h3&gt;

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

&lt;p&gt;The speed of execution is what makes AI great these days the ability to generate code or entire features that would normally take a full day,in a few minutes of prompting. That's incredible, in the grand scheme of things.&lt;/p&gt;

&lt;p&gt;What differentiates a senior engineer from a junior one is the sheer willingness to dig deeper into code to review it, question it, and spot issues before it ever gets merged into production. But that instinct comes with experience. Senior developers have seen patterns before. They know how to properly handle exceptions, where systems tend to break, and what "clean" actually looks like versus what just looks clean.&lt;/p&gt;

&lt;p&gt;Right now, AI has broken down the barrier to entry for software engineering. Folks without any coding background can spin up a real product using nothing but natural language and an LLM at the core. That's genuinely exciting. But what most people don't know and don't think to ask is whether what the AI built can actually scale, hold up under real usage, or survive contact with an edge case it wasn't shown.&lt;/p&gt;

&lt;p&gt;I put together 5 red flags you need to look out for in AI-generated code. This is useful whether you're a mid-level developer leaning on AI to move faster, or a product owner shipping with AI as your primary engineering resource.&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;As a senior engineer reading this, i beleive all of the issue mentioned in this post should not be obscure to you. &lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Hallucinated Dependencies &amp;amp; APIs
&lt;/h3&gt;

&lt;p&gt;LLMs hallucinate a lot  especially when you don't give them full context of what you're building, or when you let them guess at the rest. You'll eventually see things like a random import sitting at the top of your file that doesn't actually do anything, or a function call to a method that doesn't exist in the package you're using, or an API endpoint the AI simply assumed was there.&lt;/p&gt;

&lt;p&gt;It's important that you track all of this closely, to make sure your system stays consistent with the actual imports, packages, and API URLs you depend on not the ones the LLM confidently invented. A five-second check now saves you a broken build later, usually at the worst possible time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to catch it:&lt;/strong&gt; Verify every import and API call against the actual documentation before you merge. Run a build or install step immediately after generation if a package doesn't exist, you want that to fail loudly right away, not three commits deep when it's tangled into everything else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inconsistent or Contradictory Logic
&lt;/h3&gt;

&lt;p&gt;This one is sneakier, because the code often reads fine line by line. Each individual statement looks reasonable. It's only when you trace the logic end-to-end that you notice it doesn't actually hold together a variable gets reassigned in a way that quietly breaks an earlier assumption, a conditional branch that can never actually be reached, or two functions that handle the exact same case in two different, contradicting ways.&lt;/p&gt;

&lt;p&gt;This happens because LLMs generate code the way they generate text one plausible piece at a time, without always holding the full picture in mind. It can produce something that's locally correct but globally broken, and that kind of bug is exactly the one that slips past a quick glance and shows up in production three weeks later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to catch it:&lt;/strong&gt; Trace the logic manually, or step through it with a debugger, before you trust it with anything important. A trick that works well here: ask the AI to explain its own logic back to you, step by step. If the explanation doesn't hold up on its own, the code underneath it probably doesn't either.&lt;/p&gt;

&lt;h3&gt;
  
  
  Silent Security Gaps
&lt;/h3&gt;

&lt;p&gt;AI-generated code has a habit of optimizing for "it works," not "it's safe." That usually means missing input validation, hardcoded secrets sitting right there in plain text, or unsafe defaults that quietly work fine in development and become a real liability the moment real users touch the system.&lt;/p&gt;

&lt;p&gt;The dangerous part isn't that these gaps exist, it's that they're silent. Nothing throws an error. Nothing fails a build. The code runs perfectly, right up until someone finds the gap, and it's rarely going to be you who finds it first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to catch it:&lt;/strong&gt; Make a security linter or scanner a standard part of your workflow, not an optional extra step. Never accept a hardcoded secret in code, no matter how "temporary" it's meant to be. And be deliberate about asking the AI directly: Does this handle untrusted input? What happens if this value is empty, malformed, or malicious?&lt;/p&gt;

&lt;h3&gt;
  
  
  Missing or Superficial Test Coverage
&lt;/h3&gt;

&lt;p&gt;A lot of AI-generated code ships with no tests at all, or with tests that only check the happy path  the one scenario where every input is exactly what was expected and nothing goes wrong. That's the easiest case to test, and also the least useful one, because real usage is rarely that clean.&lt;/p&gt;

&lt;p&gt;The danger here is that a green checkmark on your tests can give you false confidence. It feels like the code is covered, when really it's only been checked against the one scenario everyone already assumed would work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to catch it:&lt;/strong&gt; Require tests to be generated alongside the code, not bolted on afterward as a formality. And when you're prompting for tests, ask explicitly for edge cases, empty inputs, wrong types, network failures, and unexpected user behavior. AI won't reach for the ugly cases on its own unless you tell it to.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unnecessary Complexity (Over-Engineering)
&lt;/h3&gt;

&lt;p&gt;Sometimes the problem isn't that the AI got something wrong; it's that it solved a simple problem in a needlessly complicated way. You'll see extra abstraction layers that don't serve a real purpose, config options nothing in your app actually uses, or dependencies pulled in to solve a problem you could've handled in five lines of code.&lt;/p&gt;

&lt;p&gt;It's not broken, exactly. It's just more than it needed to be, and every extra layer is one more thing someone on your team has to understand, maintain, and eventually debug, long after the AI that wrote it is out of the conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to catch it:&lt;/strong&gt; Make "Could this be simpler?" a standard question in every review, not an occasional afterthought. When you spot over-engineering, refactor toward the simplest solution that actually satisfies the requirement, not the most impressive-looking one.&lt;/p&gt;

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

&lt;p&gt;None of this is an argument against AI-assisted development. AI is genuinely changing what's possible, and the speed it gives you is real and valuable. The issue isn't the tool it's how it gets used.&lt;/p&gt;

&lt;p&gt;The mistake most teams make is treating AI-generated code the same way they'd treat code written by a senior engineer they've worked with for years, someone whose judgment they already trust. But AI-generated code deserves the same scrutiny you'd give a stranger's pull request because in a real sense, that's exactly what it is. It has no memory of your system's history, no instinct for your edge cases, and no accountability if something breaks in production.&lt;/p&gt;

&lt;p&gt;The good news is that none of the five red flags above require years of experience to catch they just require you to actually look. Check your imports. Trace your logic instead of skimming it. Run a security scan. Write real tests, including the ugly ones. Ask if there's a simpler way. These are habits, not talents, and they're learnable by anyone shipping code today, regardless of how many years they've been doing it.&lt;/p&gt;

&lt;p&gt;If you're a product owner without a technical background, this is your permission to ask harder questions before something ships you don't need to read the code yourself to ask whether it's been reviewed, tested, and checked for exactly these five things. And if you're a developer, mid-level or senior, this is simply what code review looks like now, applied to a new kind of author.&lt;/p&gt;

&lt;p&gt;AI can write your code faster than you ever could. Whether that code is actually good is still entirely up to you.&lt;br&gt;
A lot of AI-generated code ships with no tests at all, or with tests that only check the happy path  the one scenario where every input is exactly what was expected and nothing goes wrong. That's the easiest case to test, and also the least useful one, because real usage is rarely that clean.&lt;/p&gt;

&lt;p&gt;The danger here is that a green checkmark on your tests can give you false confidence. It feels like the code is covered, when really it's only been checked against the one scenario everyone already assumed would work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to catch it:&lt;/strong&gt; Require tests to be generated alongside the code, not bolted on afterward as a formality. And when you're prompting for tests, ask explicitly for edge cases, empty inputs, wrong types, network failures, and unexpected user behavior. AI won't reach for the ugly cases on its own unless you tell it to.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unnecessary Complexity (Over-Engineering)
&lt;/h3&gt;

&lt;p&gt;Sometimes the problem isn't that the AI got something wrong; it's that it solved a simple problem in a needlessly complicated way. You'll see extra abstraction layers that don't serve a real purpose, config options nothing in your app actually uses, or dependencies pulled in to solve a problem you could've handled in five lines of code.&lt;/p&gt;

&lt;p&gt;It's not broken, exactly. It's just more than it needed to be, and every extra layer is one more thing someone on your team has to understand, maintain, and eventually debug, long after the AI that wrote it is out of the conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to catch it:&lt;/strong&gt; Make "Could this be simpler?" a standard question in every review, not an occasional afterthought. When you spot over-engineering, refactor toward the simplest solution that actually satisfies the requirement, not the most impressive-looking one.&lt;/p&gt;

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

&lt;p&gt;None of this is an argument against AI-assisted development. AI is genuinely changing what's possible, and the speed it gives you is real and valuable. The issue isn't the tool it's how it gets used.&lt;/p&gt;

&lt;p&gt;The mistake most teams make is treating AI-generated code the same way they'd treat code written by a senior engineer they've worked with for years, someone whose judgment they already trust. But AI-generated code deserves the same scrutiny you'd give a stranger's pull request because in a real sense, that's exactly what it is. It has no memory of your system's history, no instinct for your edge cases, and no accountability if something breaks in production.&lt;/p&gt;

&lt;p&gt;The good news is that none of the five red flags above require years of experience to catch they just require you to actually look. Check your imports. Trace your logic instead of skimming it. Run a security scan. Write real tests, including the ugly ones. Ask if there's a simpler way. These are habits, not talents, and they're learnable by anyone shipping code today, regardless of how many years they've been doing it.&lt;/p&gt;

&lt;p&gt;If you're a product owner without a technical background, this is your permission to ask harder questions before something ships you don't need to read the code yourself to ask whether it's been reviewed, tested, and checked for exactly these five things. And if you're a developer, mid-level or senior, this is simply what code review looks like now, applied to a new kind of author.&lt;/p&gt;

&lt;p&gt;AI can write your code faster than you ever could. Whether that code is actually good is still entirely up to you.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI Made Coding Easier. It Also Made Bad Code Easier to Ship.</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Fri, 19 Jun 2026 04:39:33 +0000</pubDate>
      <link>https://dev.to/scanaislop/ai-made-coding-easier-it-also-made-bad-code-easier-to-ship-2bp4</link>
      <guid>https://dev.to/scanaislop/ai-made-coding-easier-it-also-made-bad-code-easier-to-ship-2bp4</guid>
      <description>&lt;p&gt;At its core, software development has always been about a simple cycle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write &amp;gt; Review &amp;gt; Deploy &amp;gt; Monitor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You ship code. The code goes through reviews. You deploy it. Then you monitor production to make sure everything stays stable. When you're working in a team, code reviews are non-negotiable. They're one of the best ways to maintain quality, catch issues early, and ensure everyone is building toward the same standards. But we're now living in a very different era. An era where a developer or, honestly, a random dude with an idea can build products through conversation.&lt;/p&gt;

&lt;p&gt;Hehe, interesting times!&lt;/p&gt;

&lt;h2&gt;
  
  
  From GitHub Copilot to "Build Me an App"
&lt;/h2&gt;

&lt;p&gt;I remember when developers were almost shy about admitting they used coding assistants. Back in the early GitHub Copilot days, saying &lt;em&gt;"I use AI to help me write code"&lt;/em&gt; sometimes felt like admitting you were taking shortcuts.&lt;/p&gt;

&lt;p&gt;Fast forward to today, and we've reached a point where people can write code using natural language. I genuinely never thought we'd get here this quickly. And since then, it's been one hell of a ride.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 7 Out of 10 Developers Ship AI-Assisted Code
&lt;/h2&gt;

&lt;p&gt;Today, most developers are shipping AI-assisted code. Not because they're bad developers. Not because they're lazy. Because it makes them faster.&lt;/p&gt;

&lt;p&gt;AI helps close the gap between domain expertise and implementation.&lt;/p&gt;

&lt;p&gt;You can go from "I've never heard of this technology" to "I can build something with it" within 30 minutes to an hour of focused work.&lt;/p&gt;

&lt;p&gt;Traditionally, learning a new framework, library, or service required days of reading documentation and experimenting.&lt;/p&gt;

&lt;p&gt;Now, AI can accelerate that process dramatically.&lt;br&gt;
That's the magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Part Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;The problem is that while AI is incredibly good at generating code, it's not always good at generating good code.&lt;/p&gt;

&lt;p&gt;Recently, I built a product using Antigravity, and while it helped me move fast, I noticed several issues almost immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Poor code quality&lt;/li&gt;
&lt;li&gt;Weak function modularization&lt;/li&gt;
&lt;li&gt;Security concerns&lt;/li&gt;
&lt;li&gt;Repeated implementation patterns&lt;/li&gt;
&lt;li&gt;Lack of reusable abstractions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code worked. But "working" and "maintainable" are two very different things.&lt;/p&gt;

&lt;p&gt;And that's really the challenge with AI-assisted development today. The volume of code being generated is growing faster than our ability to review it properly.&lt;/p&gt;

&lt;p&gt;A lot of the issues aren't outright bugs. They're the subtle things that slowly make a codebase harder to maintain over time. Swallowed exceptions, generic variable names, dead code, unnecessary comments, duplicated logic, unsafe type assertions, and TODO stubs that somehow make it to production.&lt;/p&gt;

&lt;p&gt;That's what got me interested in &lt;a href="https://scanaislop.com/" rel="noopener noreferrer"&gt;ScanAISlop&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One thing I like about it is that it isn't trying to play detective and tell you whether a human or AI wrote the code.&lt;/p&gt;

&lt;p&gt;Instead, it focuses on the stuff that actually matters: bad patterns, weak abstractions, security concerns, unnecessary complexity, and all those little things that make a codebase harder to maintain over time.&lt;/p&gt;

&lt;p&gt;The approach is pretty straightforward. No LLM sitting behind the scenes making guesses. The checks are deterministic, so the same code produces the same result every single time.&lt;/p&gt;

&lt;p&gt;And because the rules are opinionated, the output tends to be a lot more useful than tools that flag everything and leave you sorting through noise.&lt;/p&gt;

&lt;p&gt;You can try it right now on any public GitHub repository.&lt;/p&gt;

&lt;p&gt;Simply replace:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;github.com/&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scanaislop.com/&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and you'll get an instant report showing potential quality, security, and maintainability issues across the codebase.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fff76svj0spmm0nx2c286.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fff76svj0spmm0nx2c286.png" alt=" " width="799" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I ran the CLI against one of my own projects, and the results were surprisingly useful. Instead of giving me a vague score, it pointed directly to the kinds of issues that reviewers typically miss when scanning large AI-generated pull requests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F080panzzxen5hxz8ywf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F080panzzxen5hxz8ywf5.png" alt=" " width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;try &lt;code&gt;npx aislop scan&lt;/code&gt; to try-out the CLI&lt;/p&gt;

&lt;p&gt;The most interesting part?&lt;/p&gt;

&lt;p&gt;The CLI is completely open source and MIT licensed. You can inspect the rules, contribute improvements, open issues, or even help shape what good AI-assisted engineering should look like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please take a minute to try it out and star the repo: &lt;a href="https://github.com/scanaislop/aislop" rel="noopener noreferrer"&gt;https://github.com/scanaislop/aislop&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As AI continues to generate more code, I think tools like this become increasingly important—not because AI is bad, but because engineering standards shouldn't disappear just because code is easier to produce.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Advantage
&lt;/h2&gt;

&lt;p&gt;This is where engineering fundamentals still matter. Understanding how systems work, knowing how to structure a codebase, understanding design systems, knowing when to abstract a component, and knowing when not to.&lt;/p&gt;

&lt;p&gt;These things still separate experienced engineers from people who are simply prompting their way through development.&lt;/p&gt;

&lt;p&gt;For example, if I'm using a table across multiple screens, I'd rather create a reusable component once than copy and paste:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;across ten different files. AI can absolutely generate the table.&lt;/p&gt;

&lt;p&gt;But it takes engineering judgment to recognize that it should become a reusable building block.&lt;/p&gt;

&lt;p&gt;And most times, you have to explicitly tell your coding assistant that. AI can generate code. Experience tells you what code should exist in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The New Skill Isn't Coding Faster
&lt;/h2&gt;

&lt;p&gt;The new skill isn't necessarily writing code faster. It's reviewing code better. It's knowing what should be abstracted. It's spotting security issues. It's identifying AI-generated slop before it reaches production.&lt;/p&gt;

&lt;p&gt;Because the future isn't AI versus developers. The future is developers who know how to think, using AI as leverage.&lt;/p&gt;

&lt;p&gt;And those developers will always have an edge.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I think software engineers should be a bit worried.</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Tue, 28 Apr 2026 00:16:49 +0000</pubDate>
      <link>https://dev.to/miracool/i-think-software-engineers-should-be-a-bit-worried-5flk</link>
      <guid>https://dev.to/miracool/i-think-software-engineers-should-be-a-bit-worried-5flk</guid>
      <description>&lt;p&gt;It’s honestly wild to see how much AI agents have accelerated things in such a short time.&lt;/p&gt;

&lt;p&gt;Tasks that used to take weeks can now be handled in a day with the right setup. Implementation used to be where top engineers really stood out picking up the hardest problems and grinding through them. But now, agents can read docs, understand context, and execute a lot of that work.&lt;/p&gt;

&lt;p&gt;I remember seeing a post from a YouTube co-founder saying this might be the last era of “meaningful work” as we know it. That stuck with me.&lt;/p&gt;

&lt;p&gt;So I’m curious, how are you all actually feeling about this shift?&lt;/p&gt;

&lt;p&gt;If things keep moving at this pace, software engineering (at least in the traditional sense) could look very different in the next couple of years. If agents handle reading, coding, and even coordination… where does that leave us?&lt;/p&gt;

&lt;p&gt;Are there new skills we should be focusing on? New roles emerging? Or is this just another evolution we’ll adapt to like we always have?&lt;/p&gt;

&lt;p&gt;Would really love to hear different perspectives on this.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>softwareengineering</category>
      <category>programming</category>
    </item>
    <item>
      <title>Do people still genuinely care about technical articles ?</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Sun, 15 Feb 2026 23:42:17 +0000</pubDate>
      <link>https://dev.to/miracool/do-people-still-genuinely-care-about-technical-articles--1hfk</link>
      <guid>https://dev.to/miracool/do-people-still-genuinely-care-about-technical-articles--1hfk</guid>
      <description>&lt;p&gt;AI has spread like wildfire. In software development especially, it’s changing how we learn and solve problems. Instead of digging through documentation or reading long-form blog posts, many engineers now turn to AI for direct, tailored answers. It’s faster. It’s contextual. And if you know how to prompt well, it can even feel like having a senior engineer on demand.&lt;/p&gt;

&lt;p&gt;But it makes me wonder:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Do people still genuinely care about technical articles?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are long-form developer posts becoming obsolete, or are they evolving into something AI can’t replace?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is there a kind of depth, perspective, or storytelling that only comes from reading someone’s full thought process?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we optimizing for speed over understanding?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI gives answers, and articles often give context.&lt;/p&gt;

&lt;p&gt;Maybe the real question is :&lt;br&gt;
Are we building engineers who can ship fast or engineers who deeply understand what they’re shipping?&lt;/p&gt;

&lt;p&gt;Curious to hear your thoughts, hmmm.&lt;/p&gt;

</description>
      <category>community</category>
      <category>discuss</category>
      <category>software</category>
    </item>
    <item>
      <title>Web 3</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Fri, 13 Feb 2026 01:29:42 +0000</pubDate>
      <link>https://dev.to/miracool/web-3-5eek</link>
      <guid>https://dev.to/miracool/web-3-5eek</guid>
      <description></description>
    </item>
    <item>
      <title>Laid Off on the First Workday of the Year—and What Came Next</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Fri, 09 Jan 2026 08:52:55 +0000</pubDate>
      <link>https://dev.to/miracool/laid-off-on-the-first-workday-of-the-year-and-what-came-next-gii</link>
      <guid>https://dev.to/miracool/laid-off-on-the-first-workday-of-the-year-and-what-came-next-gii</guid>
      <description>&lt;p&gt;How would you feel if you were affected by a layoff on the very first workday of the year due to restructuring? You’d probably feel emotionally drained. And that’s okay; no one wants to lose their job, especially not on the first workday of a new year.&lt;/p&gt;

&lt;p&gt;This is usually the time when people reflect on the past year—though maybe it’s just me, and not everyone does this before work fully resumes in January, i.e., set goals and make plans for what’s ahead. You’ve already mapped things out, set targets, and envisioned how the year should go. Then, out of nowhere, boom! You’re out.&lt;/p&gt;

&lt;p&gt;Thinking about it now feels strange, because this is exactly where I find myself. But interestingly, the way I feel is quite different from everything I’ve just described.&lt;/p&gt;

&lt;p&gt;I have mixed feelings because, on one hand, I fancy the idea of a new challenge somewhere with a truly developer-focused product, and I have already been planning my next move and job search. On the other hand, I don’t like the idea of being laid off at all, especially since this is my first time experiencing something like this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Just to be clear, I was indeed offered more responsibility with an improved salary 2 months ago. However, we were unable to come to terms based on my expectations. In all, I'm grateful for the consideration.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How I’m Managing This Moment
&lt;/h2&gt;

&lt;p&gt;I do have plans for the year. That said, I’ll be prioritizing finding a new role above everything else right now for the sake of my mental health. This will probably be the first time in the past four years that I’m not actively working or employed by a company, so I’m still figuring out how to navigate this phase. It feels unfamiliar, but I’m confident I’ll find my footing.&lt;/p&gt;

&lt;p&gt;In the meantime, I plan to stay intentional and keep building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Working on personal projects in Rust and MOVE, driven by my growing interest in stablecoin adoption for global remittance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exploring and building projects in AI, really interested in AI agents, including MCP and related tooling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continuing to deepen my interest in web platforms and infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm a frontend engineer first before DevRel, so I have also been looking at still working, and that also helps improve my web platform experience due to the fact that I have managed deployment many a time.&lt;/p&gt;

&lt;p&gt;I know these are different areas, but my approach is to focus on them one at a time rather than all at once. Although I'm open to feedback and suggestions on how to manage this in the comment section. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Next?
&lt;/h2&gt;

&lt;p&gt;This is probably the question on your mind, lol! A quick intro about me and what I have been up to over the years. My name is Femi, a developer relations engineer working at the intersection of product, engineering, and customer success. Over the past year, I transitioned from a frontend engineering background into full-time DevRel, where I’ve worked closely with tech leads, CTOs, heads of growth, and product managers to drive developer relations at an organizational level.&lt;/p&gt;

&lt;p&gt;Along the way, I’ve worn multiple hats as a frontend engineer, technical writer, and developer educator, helping shape developer experience through documentation, demos, and hands-on education. I’ve also hosted virtual developer events and delivered live demos at community and industry events, all focused on helping developers build confidently and successfully with the product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkd7tlkg1xxtuofn78pfm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkd7tlkg1xxtuofn78pfm.jpg" alt="Nomba X wordpress lagos event" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Developer-focused event with the WordPress community in Lagos. I did a quick DEMO on how you can set up the Nomba payment plugin on the WooCommerce store&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I’ve also hosted a virtual event on webhooks in payment integrations—you can find the recording on the &lt;a href="https://www.youtube.com/@nomba_developers" rel="noopener noreferrer"&gt;Nomba Developers&lt;/a&gt;&lt;br&gt;
YouTube channel.&lt;/p&gt;

&lt;p&gt;In addition, I’ve written technical articles for OpenReplay; you can &lt;a href="https://blog.openreplay.com/authors/makanju-oluwafemi-emmanuel/" rel="noopener noreferrer"&gt;view my profile and published work here&lt;/a&gt;&lt;br&gt;
. I’ve also contributed extensively to technical documentation for devtools and payment solution platforms, with my most recent work being end-to-end payment documentation for a &lt;a href="https://novacpayment.mintlify.app/docs/introduction/welcome-to-novac" rel="noopener noreferrer"&gt;Nigerian startup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’m currently looking for my next role and would love to join a developer-first or developer-plus company. If you have an open-source project you’d like me to contribute to as a technical writer, or know someone I should speak with, I’d really appreciate the connection.&lt;/p&gt;

&lt;p&gt;You can reach me directly at &lt;a href="mailto:makurseme@gmail.com"&gt;makurseme@gmail.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>opensource</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Learn how to authenticate with react JS</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Mon, 08 Sep 2025 23:20:27 +0000</pubDate>
      <link>https://dev.to/miracool/learn-how-to-authenticate-with-react-js-5c5n</link>
      <guid>https://dev.to/miracool/learn-how-to-authenticate-with-react-js-5c5n</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/miracool/how-to-manage-user-authentication-with-react-js-3ic5" class="crayons-story__hidden-navigation-link"&gt;How to manage user authentication With React JS&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/miracool" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F628059%2Fe5da7c2a-8dd4-4559-af13-0997e018ee5f.jpg" alt="miracool profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/miracool" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Makanju Oluwafemi
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Makanju Oluwafemi
                
              
              &lt;div id="story-author-preview-content-1708254" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/miracool" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F628059%2Fe5da7c2a-8dd4-4559-af13-0997e018ee5f.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Makanju Oluwafemi&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/miracool/how-to-manage-user-authentication-with-react-js-3ic5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 26 '23&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/miracool/how-to-manage-user-authentication-with-react-js-3ic5" id="article-link-1708254"&gt;
          How to manage user authentication With React JS
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/miracool/how-to-manage-user-authentication-with-react-js-3ic5" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;566&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/miracool/how-to-manage-user-authentication-with-react-js-3ic5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              43&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>How to Setup Nomba Checkout on shopify</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Mon, 10 Mar 2025 11:49:06 +0000</pubDate>
      <link>https://dev.to/nomba-financial-service/how-to-setup-nomba-checkout-on-shopify-dfh</link>
      <guid>https://dev.to/nomba-financial-service/how-to-setup-nomba-checkout-on-shopify-dfh</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Nomba provides a Shopify checkout plugin to accept payment in your online store. This plugin is similar to the &lt;a href="https://developer.nomba.com/plugins-and-sdk/overview" rel="noopener noreferrer"&gt;WordPress plugin&lt;/a&gt; simply because they are both used for accepting online payments. Also, it belongs to the no-code ecosystem. When building a Shopify store, there are different ways to accept payment. &lt;/p&gt;

&lt;p&gt;Typically, payment is a third-party thing for Shopify, but then they support some providers by default. This process is slightly different when you want to use Nomba as a payment provider in your Shopify store.&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;This Plugin is available to Nigerian merchants and it can be used to process internatio&lt;br&gt;
nal and local Payments.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;To use Nomba as your Shopify store payment provider, you will need to &lt;strong&gt;create an account&lt;/strong&gt; on the &lt;a href="https://nomba.com/" rel="noopener noreferrer"&gt;Nomba Website&lt;/a&gt;  &amp;gt;  go to the settings page on your dashboard. Click on Get &lt;strong&gt;API Keys&lt;/strong&gt;. The process is straightforward.&lt;/p&gt;

&lt;p&gt;These are the 3 things to get on the settings page before adding Nomba as a payment provider on your store. We provide the option to switch between live and test keys.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; ClientID&lt;/li&gt;
&lt;li&gt;Private Key&lt;/li&gt;
&lt;li&gt;Account ID&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step-by-step installation guide
&lt;/h2&gt;

&lt;p&gt;The step requires that you add Nomba as a third-party app. Look at &lt;a href="https://apps.shopify.com/nomba-gateway" rel="noopener noreferrer"&gt;Nomba Shopify plugin&lt;/a&gt; here and click on Install&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwm3aw065nbstyv1kalhy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwm3aw065nbstyv1kalhy.png" alt="app-download-page" width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
When you click on Install, you will be redirected to your Shopify admin page, where you can now properly install the Nomba app.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6fes5iskfhfgojdwne0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6fes5iskfhfgojdwne0.png" alt="install" width="800" height="326"&gt;&lt;/a&gt;&lt;br&gt;
Click on Install to continue.&lt;br&gt;
When you successfully install this app, You will be redirected to Nomba payment gateway config page. On this page, You will add your Client ID, private secret, and account ID.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3850is016lm8wt6xayhj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3850is016lm8wt6xayhj.png" alt="add-api-keys" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You can get test and live keys on your settings page when you have completed setting up your dashboard.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;
&lt;br&gt;
&lt;/blockquote&gt;

&lt;p&gt;Click on the Ready checkbox, then click the Submit button, and you will get a notification that your data was saved without issue. Click go back to payment settings to activate the Nomba app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuaindakes9as0lp4rsgh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuaindakes9as0lp4rsgh.png" alt="setting-updated" width="800" height="202"&gt;&lt;/a&gt;&lt;br&gt;
This image shows a notification update, describing the status of the action you just completed.&lt;/p&gt;

&lt;p&gt;Click on the arrow left button and you will be redirected to a page where you can now activate Nomba for your Shopify app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2nj371dtygz4855mg3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2nj371dtygz4855mg3g.png" alt="setting-updated" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the activate button and you have successfully enabled Nomba as a payment service in your Shopify App. You can also choose to select  which card you would love your business to accept but for this tutorial we have all selected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpxqdoi48fipeoaah31x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpxqdoi48fipeoaah31x.png" alt="updated" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  conclusion
&lt;/h2&gt;

&lt;p&gt;With Nomba, you gain access to a reliable and secure payment solution that enhances your store’s checkout experience. Whether you're running a small business or scaling an enterprise, using Nomba as a payment provider, ensures that your customers enjoy smooth payment processing experience.  Now, your business can thrive without thinking of any payment hassle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://join.slack.com/t/nombadevelope-6l32082/shared_invite/zt-2yhdw0typ-LFC8ce2yBLlW9FAxJjplJQ" rel="noopener noreferrer"&gt;&lt;br&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdht4ofoyn%2Fimage%2Fupload%2Fv1736993672%2FArtboard_1_3x-50_efs2m3.jpg%2520align%3D" alt="affiliate-program" width="800" height="400"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>shopify</category>
      <category>nocode</category>
      <category>payment</category>
    </item>
    <item>
      <title>How Charge APIs Enhance Payment Processing in Fintech</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Wed, 29 Jan 2025 14:04:29 +0000</pubDate>
      <link>https://dev.to/nomba-financial-service/how-charge-apis-enhance-payment-processing-in-fintech-3o1n</link>
      <guid>https://dev.to/nomba-financial-service/how-charge-apis-enhance-payment-processing-in-fintech-3o1n</guid>
      <description>&lt;p&gt;As developers building payment solutions, we often encounter the term "charge," which can sometimes be confusing. In some cases, you might also come across the term Direct Charge. A charge refers to the specific action of processing a payment, which typically involves the authorization and capture of funds from the customer's payment method. Essentially, it’s the step where the transaction is finalized and the money is transferred from the customer to the merchant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Importance of Charge API in modern payment systems
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Customization and Branding&lt;/strong&gt;&lt;br&gt;
Unlike traditional checkout systems, which typically redirect customers to a third-party page, the Charge API allows you to fully customize the payment experience. You can tailor the design and user flow to match your brand's identity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enhanced Security Features&lt;/strong&gt;&lt;br&gt;
Charge APIs often include built-in security measures like 3D Secure authentication and OTP verification to further protect against fraudulent transactions. This helps provide legitimate information about the card owner's identity. &lt;/p&gt;

&lt;p&gt;Charge API offers enhanced flexibility, better control, and a more personalized, secure payment experience than traditional checkout methods. This makes it an ideal choice for developers looking to take full control of their payment experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Nomba Charge API and the Process Flow
&lt;/h2&gt;

&lt;p&gt;The Nomba Charge API is a user-friendly payment solution that helps businesses securely process payments. Whether you’re accepting card payments, handling OTP-based authorizations, or offering transfer payments, Nomba Charge makes it simple. It lets you save customer card details for future purchases, authenticate transactions through OTPs, and track transaction statuses with ease. The process flow is straightforward, guiding you from getting order details to saving cards and even canceling incomplete transactions. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Process Diagram&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdht4ofoyn%2Fimage%2Fupload%2Fv1737944291%2Fresized-process-flow_dnvo1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdht4ofoyn%2Fimage%2Fupload%2Fv1737944291%2Fresized-process-flow_dnvo1c.png" alt="process-flow" width="800" height="893"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This flowchart provides developers with a comprehensive understanding of how the Nomba Charge API works. To begin, you'll create an order and submit the customer’s card details. An OTP will then be sent to the customer’s phone number. The customer can either enter the code to complete the verification or request a new code if the OTP expires. They also have the option to use a Flash account number. Once the process is complete, you can prompt the customer to decide if they’d like to save their card information for future payments. &lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of Nomba Charge API
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Flash Payment Integration&lt;/strong&gt;&lt;br&gt;
The Charge API supports Flash payments, allowing users to complete transactions quickly and securely using their Flash account number. This feature simplifies payment by offering a convenient alternative to traditional card payments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Card Saving for Future Payments&lt;/strong&gt;&lt;br&gt;
With the Nomba Charge API, you can offer customers the option to save their card details securely for future transactions. This will make future payments faster and more convenient, improving the overall user experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Secure OTP Verification&lt;/strong&gt;&lt;br&gt;
Security is important! The API uses OTP to verify user transactions. This two-factor authentication ensures that payments are processed securely and that only authorized users can complete a transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Charge API vs Traditional Payment Gateways
&lt;/h2&gt;

&lt;p&gt;Unlike traditional checkout systems, where customers are redirected to an external page to complete their payment and then returned to a callback URL set during transaction initialization, the Charge API allows you to create a fully customized payment gateway that aligns with your brand's look and feel.&lt;/p&gt;

&lt;p&gt;This gives you greater control over the entire payment process. With the Charge API, you can easily implement features such as saving customer cards for recurring payments, authorizing transactions via OTP (One-Time Password), and enabling 3D Secure authentication for enhanced security.&lt;/p&gt;

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

&lt;p&gt;Really glad you made it this far, haha! There are so many possibilities with building your product around the Nomba API. The charge API is just one of them. looking to explore our payment product? &lt;a href="https://developer.nomba.com/introduction/welcome-to-nomba" rel="noopener noreferrer"&gt;check here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://join.slack.com/t/nombadevelope-6l32082/shared_invite/zt-2yhdw0typ-LFC8ce2yBLlW9FAxJjplJQ" rel="noopener noreferrer"&gt;&lt;br&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcqcsyuxzbdzb95cj4ml4.jpg" alt="affiliate-program" width="800" height="200"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>express</category>
      <category>fintech</category>
      <category>payment</category>
    </item>
    <item>
      <title>Learn how to accept payment in your woocomerce store. Wp Guys, check this out</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Tue, 28 Jan 2025 04:09:37 +0000</pubDate>
      <link>https://dev.to/miracool/learn-how-to-accept-payment-in-your-woocomerce-store-wp-guys-check-this-out-24ai</link>
      <guid>https://dev.to/miracool/learn-how-to-accept-payment-in-your-woocomerce-store-wp-guys-check-this-out-24ai</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/nomba-financial-service" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F10242%2Faf65a922-ffc4-435b-832a-cdd78d08e892.png" alt="Nomba Financial Service" width="800" height="603"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F628059%2Fe5da7c2a-8dd4-4559-af13-0997e018ee5f.jpg" alt="" width="800" height="999"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/nomba-financial-service/how-to-setup-nomba-checkout-on-woocommerce-4o05" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to setup Nomba checkout on Woocommerce&lt;/h2&gt;
      &lt;h3&gt;Makanju Oluwafemi for Nomba Financial Service ・ Jan 27&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#wordpress&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#woocommerce&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How to setup Nomba checkout on Woocommerce</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Mon, 27 Jan 2025 01:01:45 +0000</pubDate>
      <link>https://dev.to/nomba-financial-service/how-to-setup-nomba-checkout-on-woocommerce-4o05</link>
      <guid>https://dev.to/nomba-financial-service/how-to-setup-nomba-checkout-on-woocommerce-4o05</guid>
      <description>&lt;p&gt;&lt;a href="https://woocommerce.com/" rel="noopener noreferrer"&gt;WooCommerce&lt;/a&gt; is a free online WordPress plugin that allows developers to manage online stores by providing quick setup configurations for product display, managing orders, and processing payments via the multiple payment gateways option provided.&lt;/p&gt;

&lt;p&gt;In this guide, we will walk through a step-by-step guide on how to add a &lt;a href="https://nomba.com/" rel="noopener noreferrer"&gt;nomba&lt;/a&gt; to your e-commerce website.&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s important to know that this payment plugin is currently only available for Nigerian merchants.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;Before diving deep into the "how" of this guide, I have summarized what is expected. This will give you an overview or brief into what we need to do to get this checkout page up and running quickly.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install WooCommerce, &lt;a href="https://wordpress.org/plugins/classic-editor/" rel="noopener noreferrer"&gt;Classic Editor Plugin&lt;/a&gt; and &lt;a href="https://wordpress.org/plugins/wc-nomba-gateway/#description" rel="noopener noreferrer"&gt;Nomba Payment Gateway for WooCommerce&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get Nomba API keys&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setup Nomba plugins&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to Install a WordPress Plugin
&lt;/h2&gt;

&lt;p&gt;Adding a plugin in WordPress is synonymous with installing an NPM package when writing code. Ideally, plugins extend the capabilities of a project by enabling more functionalities. To add a plugin to your WordPress site, &lt;strong&gt;go to the WordPress admin&lt;/strong&gt; page. Select ** Plugins ** You should be presented with a page that looks Like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwsx28i3zn5sm6iiafys.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwsx28i3zn5sm6iiafys.jpg" alt="Add-plugin" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the &lt;strong&gt;Add Plugins button&lt;/strong&gt;, then search for the WooCommerce plugin. Click on install and activate.&lt;/p&gt;

&lt;p&gt;To install the Nomba Checkout Plugin, repeat the same process. When you search for the Nomba plugin, you will be presented with this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxccyvm7jw40z148cg8a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxccyvm7jw40z148cg8a.jpg" alt="Select-nomba-checkout" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This image shows the result of a search when a developer types in Nomba.&lt;/p&gt;

&lt;p&gt;It's possible that when you complete all of these installations and are about to test, you will be presented with an error description like the one in the image below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frp8izq1vjbg8fqibdp84.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frp8izq1vjbg8fqibdp84.jpg" alt="fix-payment-error" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This image can be found on this &lt;a href="https://paygate.to/fix-woocommerce-there-are-no-payment-methods-available-error/" rel="noopener noreferrer"&gt;site&lt;/a&gt;, where you can learn more about why the error exists and how to fix it using the Classic Editor Plugin.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get Nomba API keys
&lt;/h2&gt;

&lt;p&gt;When you have completed the installation of all the plugins, head over to &lt;strong&gt;Nomba&lt;/strong&gt; &amp;gt; &lt;strong&gt;Create account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Dashboard&lt;/strong&gt;, click on settings on the right pane, and select &lt;strong&gt;Webhooks and API Keys&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkt6hmcge84rock4py23y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkt6hmcge84rock4py23y.png" alt="API-key-page" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A pictorial representation API keys page.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Setup Nomba Plugin
&lt;/h2&gt;

&lt;p&gt;Next, when you have completed the installation of all plugins, ensure that you activate the plugins so they can work as expected. Click on &lt;strong&gt;Manage&lt;/strong&gt; to add API keys.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fupmbpcvj2lfusftrqbbv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fupmbpcvj2lfusftrqbbv.jpg" alt="manage-plugin" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This Image explains how to manage the plugin  &lt;/p&gt;

&lt;p&gt;Next, you will add your Nomba credentials to the plugins.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnuxr7x2uy0n5k2symte4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnuxr7x2uy0n5k2symte4.jpg" alt="API-key-page" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We use the &lt;strong&gt;API keys and account ID&lt;/strong&gt; to connect with your Nomba account. Add the appropriate keys in the box. Select Test mode and Click &lt;strong&gt;Save Changes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Voila!, You have completed the installation and setup of your checkout plugin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accept payment on your Nomba Checkout Page
&lt;/h2&gt;

&lt;p&gt;If you are here, it means you have followed us through from beginning to end, and I'm glad you have been able to see how to install and use the Nomba WooCommerce plugin.&lt;/p&gt;

&lt;p&gt;Next, when you click on the checkout page, it will redirect you to the checkout page, and you can proceed to pay.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lvcj40b73gmvwnqw34u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lvcj40b73gmvwnqw34u.jpg" alt="checkout page" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;. This image shows a checkout order. &lt;/p&gt;

&lt;p&gt;When you click on Place Order, you will be redirected to this screen to complete your payment. &lt;br&gt;
Add your card details, and you are ready to go.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjyoy6qihzd27jrwvk2g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjyoy6qihzd27jrwvk2g.jpg" alt="checkout-card-page" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ve successfully integrated the Nomba payment gateway into your WooCommerce store. With this setup, you can now accept payments seamlessly on your checkout page. Just ensure your store is set up correctly with the provided API keys and the Nomba plugin.&lt;/p&gt;

&lt;p&gt;If you run into any issues, consult the Nomba developer community. You're now ready to offer your customers a smooth checkout experience!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdht4ofoyn%2Fimage%2Fupload%2Fv1736993672%2FArtboard_1_3x-50_efs2m3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdht4ofoyn%2Fimage%2Fupload%2Fv1736993672%2FArtboard_1_3x-50_efs2m3.jpg" alt="affiliate-program" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>wordpress</category>
      <category>woocommerce</category>
    </item>
    <item>
      <title>Submitting form data to Google Sheet from a React App</title>
      <dc:creator>Makanju Oluwafemi</dc:creator>
      <pubDate>Tue, 03 Sep 2024 16:03:27 +0000</pubDate>
      <link>https://dev.to/miracool/submitting-form-data-to-a-google-sheet-from-a-react-app-3o83</link>
      <guid>https://dev.to/miracool/submitting-form-data-to-a-google-sheet-from-a-react-app-3o83</guid>
      <description>&lt;p&gt;One thing that &lt;a href="https://www.google.com/" rel="noopener noreferrer"&gt;Google&lt;/a&gt; does that amazes me is the use cases that come with working with their workspace tools, be it Gmail, Google, or Meet. There are different ways to work with them. &lt;br&gt;
In this article, we will explore integrating Google Sheets, a workspace tool created to serve as an online spreadsheet. It's a feature-rich text editor where you can create, edit and collaborate. How do we intend to do this? Imagine we are making a waitlist for a start-up product and need to get people's data and store it for a campaign. You can leverage the Google Sheets API to get this data instead of worrying yourself about the problem of creating a backend and some database. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For you to follow this guide, honestly, I will say your experience in React or Vue won't matter, as basic Javascript knowledge can be applied to both. However, I will use a React app.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Introduction to AppScript
&lt;/h2&gt;

&lt;p&gt;Appscript is a JavaScript cloud-based platform that allows you to integrate with Google products, You can automate tasks across products like calendars, spreadsheets, and so on. Our focus in this article is Appscript for Google Sheets. &lt;/p&gt;
&lt;h2&gt;
  
  
  Create and set up a Spreadsheet
&lt;/h2&gt;

&lt;p&gt;Go to &lt;a href="https://docs.google.com/spreadsheets/" rel="noopener noreferrer"&gt;spreadsheet on Google&lt;/a&gt; and create a new blank spreadsheet.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl0jvb51viigheb4izca3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl0jvb51viigheb4izca3.png" alt="Image description" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;strong&gt;Extension&lt;/strong&gt; on the spreadsheet editor tab, you will be presented with a pop-up that looks like this.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3by28n0e0hc9gpc8enn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3by28n0e0hc9gpc8enn.png" alt="Image description" width="616" height="395"&gt;&lt;/a&gt; &lt;br&gt;
Click on Appscript, and you will be redirected to a new web-based editor to start writing your script. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4qe8kh0fkm0snfhz57x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4qe8kh0fkm0snfhz57x.png" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Add a script and deploy your app.
&lt;/h2&gt;

&lt;p&gt;Next, copy and paste the code below into your editor.&lt;br&gt;
Next&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-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;sheetName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sheet1&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;scriptProp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;PropertiesService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getScriptProperties&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;initialSetup&lt;/span&gt; &lt;span class="p"&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;activeSpreadsheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SpreadsheetApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getActiveSpreadsheet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;scriptProp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;activeSpreadsheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getId&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;doPost&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&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;lock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;LockService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getScriptLock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tryLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;try&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;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SpreadsheetApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scriptProp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;key&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;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSheetByName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sheetName&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;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLastColumn&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;getValues&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextRow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLastRow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newRow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&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;header&lt;/span&gt;&lt;span class="p"&gt;)&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;header&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parameter&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="nx"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nextRow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newRow&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="nf"&gt;setValues&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;newRow&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;ContentService&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createTextOutput&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="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;result&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;success&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;row&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextRow&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setMimeType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ContentService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MimeType&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="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&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;ContentService&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createTextOutput&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="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;result&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;error&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;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setMimeType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ContentService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MimeType&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="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;releaseLock&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, click on the run button; you should get a success message in the output section.&lt;/p&gt;

&lt;p&gt;To deploy these changes, click on the deploy button; a small modal will appear underneath it. choose a new deployment.&lt;br&gt;
After that, a modal will pop up, Click select type settings and choose web app from the modal, then set "who has access" to anyone and "execute as" to me. Click on deploy; you should be redirected to the authorize screen. Follow the onscreen guide, and you should be okay.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvc09ipfaziqh62s8uoo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvc09ipfaziqh62s8uoo.png" alt="Image description" width="800" height="542"&gt;&lt;/a&gt;&lt;br&gt;
A screenshot of how the modal should look.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When you are authorizing, Google might not have verified your app, so click advance to the unsafe site when authorizing; no issues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
When all steps have been completed, you should get a screen containing your deployment ID and Web App URL, Copy and save them somewhere because you will need them to be able to push from your React app to this sheet. Click done and you should be redirected to your web base editor.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjup644v44pymop2yjjz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjup644v44pymop2yjjz.png" alt="Image description" width="532" height="695"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Set Up A trigger
&lt;/h2&gt;

&lt;p&gt;To set up a trigger, hover on the right pane; a swipe-out navigation layer will be presented, select &lt;code&gt;Triggers&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o7lxzizc9twgkbittuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o7lxzizc9twgkbittuy.png" alt="Image description" width="551" height="509"&gt;&lt;/a&gt;&lt;br&gt;
Click on the add trigger button. You will get a modal popup for adding your trigger function. These functions are divided into four; you can edit whichever one you want to use for this guide.&lt;/p&gt;

&lt;p&gt;Select &lt;code&gt;do Post&lt;/code&gt; for the function to run, &lt;code&gt;Head&lt;/code&gt; for deployment to run, &lt;code&gt;from spreadsheet&lt;/code&gt; for the selective event source, and &lt;code&gt;on form submit&lt;/code&gt; for the selective event type.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fng24sfm2in4z99svvr5z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fng24sfm2in4z99svvr5z.png" alt="Image description" width="800" height="566"&gt;&lt;/a&gt;&lt;br&gt;
This is the image of how the triger modal should look.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Create a React Form and push data from your app
&lt;/h2&gt;

&lt;p&gt;To create a form, I have bootstrapped a react and typescript code. As I have said, you can always apply everything here in another framework; nothing too complicated. &lt;/p&gt;

&lt;p&gt;Next, copy this code into &lt;code&gt;App.tsx&lt;/code&gt;, it's just an example to show how to implement it in your own code. Please take note that you have to pass your app ID to the base URL; also, your payload data needs to be passed to &lt;code&gt;formData()&lt;/code&gt; for it to work.&lt;br&gt;
&lt;code&gt;App.tsx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-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;React&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&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&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;handlePost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FormEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLFormElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&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;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&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="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&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;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;}&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;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;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Created At&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLocaleString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputValue&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;APP_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;APP_ID&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;baseURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://script.google.com/macros/s/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;APP_ID&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/exec`&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;key&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;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;try&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;,&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;body&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="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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Request was successful:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Request Failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error during fetch:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handlePost&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter Email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;submit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/form&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this code example, I created a form to get user emails and send them to the sheet when the user clicks on submit. When a user clicks, an event  &lt;code&gt;handlePost&lt;/code&gt; is triggered, passed through an asynchronous action, and it sends a request containing the input email address and the current time and date.&lt;/p&gt;

&lt;p&gt;If everything is successful, you should have your email and time in your Google sheet like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvd5w4rj95cp59i4wufma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvd5w4rj95cp59i4wufma.png" alt="Image description" width="504" height="556"&gt;&lt;/a&gt;&lt;br&gt;
A screenshot of the spreadsheet with inputted data from the form&lt;/p&gt;

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

&lt;p&gt;There are so many advantages to using Google Sheets, as it can be used in place of a backend to gather quick information from users from your app. There are other google workspace tool integration to explore, however, this will be our focus for now, hopefully later i can share articles on how to implement with other tools. Happy coding!    &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>react</category>
      <category>vue</category>
    </item>
  </channel>
</rss>
