<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ben Sabic</title>
    <description>The latest articles on Forem by Ben Sabic (@bensabic).</description>
    <link>https://forem.com/bensabic</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1008386%2Fcb4809dd-3b30-4b9f-b327-518c0803cfe3.jpg</url>
      <title>Forem: Ben Sabic</title>
      <link>https://forem.com/bensabic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bensabic"/>
    <language>en</language>
    <item>
      <title>Replace Your Vector Pipeline with bash</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Sat, 21 Mar 2026 14:10:42 +0000</pubDate>
      <link>https://forem.com/bensabic/replace-your-vector-pipeline-with-bash-2goj</link>
      <guid>https://forem.com/bensabic/replace-your-vector-pipeline-with-bash-2goj</guid>
      <description>&lt;p&gt;Most knowledge agents follow the same playbook: pick a vector database, build a chunking pipeline, choose an embedding model, tune retrieval parameters. Weeks later, your agent confidently returns the wrong answer and you can't figure out why.&lt;/p&gt;

&lt;p&gt;We took a different path. Instead of embeddings, we gave the agent a filesystem and &lt;code&gt;bash&lt;/code&gt;. It searches your content using &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, and &lt;code&gt;cat&lt;/code&gt; inside isolated sandboxes. No vector DB, no chunking, no embedding model.&lt;/p&gt;

&lt;p&gt;The results were striking. Applying this pattern to a sales call summarization agent cut costs from ~$1.00 to ~$0.25 per call, and output quality actually improved. The core insight is simple: LLMs have been trained on enormous amounts of code. They already know how to navigate directories and grep through files. You're not teaching the model a new skill. You're leveraging the one it's best at.&lt;/p&gt;

&lt;p&gt;Debugging gets a lot easier too. With vectors, a bad answer means trying to understand why one chunk scored 0.82 while the correct one scored 0.79. Was it the chunking boundary? The embedding model? The similarity threshold? With filesystem search, you open the trace and see exactly which commands ran, which files were read, and where things went wrong. The whole fix loop takes minutes.&lt;/p&gt;

&lt;p&gt;We open-sourced a production-ready version of this architecture called the &lt;strong&gt;Knowledge Agent Template&lt;/strong&gt;, built on Vercel Sandbox, AI SDK, and Chat SDK. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File-system-based search with no vector DB required&lt;/li&gt;
&lt;li&gt;Multi-platform deployment via Chat SDK (GitHub, Discord, Slack, Teams, and more from a single codebase)&lt;/li&gt;
&lt;li&gt;A complexity router that sends simple questions to fast, cheap models and hard questions to powerful ones&lt;/li&gt;
&lt;li&gt;Built-in admin tools with usage stats, error logs, and an AI-powered admin agent for debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read the full writeup and deploy the template:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://vercel.com/blog/build-knowledge-agents-without-embeddings" rel="noopener noreferrer"&gt;vercel.com/blog/build-knowledge-agents-without-embeddings&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How Agent Skills Can Make AI Actually Useful for Your Business</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Thu, 26 Feb 2026 01:15:54 +0000</pubDate>
      <link>https://forem.com/224industries/how-agent-skills-can-make-ai-actually-useful-for-your-business-249e</link>
      <guid>https://forem.com/224industries/how-agent-skills-can-make-ai-actually-useful-for-your-business-249e</guid>
      <description>&lt;p&gt;Most people use AI the same way: open a chat, type a prompt, hope for the best. Sometimes it works. Often it doesn't, because the AI has no idea how your business operates, what tools you use, or what good output looks like for your team.&lt;/p&gt;

&lt;p&gt;Agent skills change that. They're a simple, open format for giving AI agents the specific knowledge they need to do a job well. And they're about to reshape how marketing teams, designers, and agencies work with AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Agent Skills?
&lt;/h2&gt;

&lt;p&gt;An agent skill is a folder containing instructions, reference docs, and scripts that an AI agent can read when it needs them. Think of it like an onboarding guide you'd hand a new team member on their first day, except the new hire is an AI model.&lt;/p&gt;

&lt;p&gt;Each skill has a &lt;code&gt;SKILL.md&lt;/code&gt; file that tells the agent what the skill does and when to use it. When the agent encounters a task that matches, it reads the instructions and gets to work with the right context. No guessing, no hallucinating, no generic output.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agentskills.io/what-are-skills" rel="noopener noreferrer"&gt;Anthropic originally built skills&lt;/a&gt; for Claude, then released the format as an open standard. Now they work across a growing number of AI tools, and partners like Canva, Notion, Figma, and Atlassian are already building their own.&lt;/p&gt;

&lt;p&gt;Here's why that matters for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should Marketers and Designers Care?
&lt;/h2&gt;

&lt;p&gt;If you've ever asked an AI to write a blog post and received something that sounds like a Wikipedia entry, you've hit the knowledge gap problem. The AI is smart, but it doesn't know your brand voice, your audience, your content strategy, or your style guidelines.&lt;/p&gt;

&lt;p&gt;Skills close that gap. A well-built skill can teach an AI how your team actually works: how you structure blog posts, what tone you use, which metrics matter, and how you format deliverables. The result is output that's useful from the first draft, not the fifth.&lt;/p&gt;

&lt;p&gt;And skills aren't limited to coding tools. You can use them in &lt;a href="https://claude.ai" rel="noopener noreferrer"&gt;Claude's web interface&lt;/a&gt;, in Claude Cowork (a desktop tool for file and task automation), and through the API. If your workflow involves generating reports, drafting content, analysing data, or building presentations, skills can improve the quality of every one of those tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Use Agent Skills Every Day
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://224industries.com.au/info" rel="noopener noreferrer"&gt;224 Industries&lt;/a&gt;, we started building custom skills because we were tired of babysitting AI output. We're a Webflow agency that works with tech and SaaS companies like &lt;a href="https://224industries.com.au/work/easy-agile" rel="noopener noreferrer"&gt;Easy Agile&lt;/a&gt;, &lt;a href="https://224industries.com.au/work/clear-dynamics" rel="noopener noreferrer"&gt;Clear Dynamics&lt;/a&gt;, and &lt;a href="https://224industries.com.au/work/giraffe" rel="noopener noreferrer"&gt;Giraffe&lt;/a&gt;, and our work spans strategy, design, and development. AI touches all three.&lt;/p&gt;

&lt;p&gt;Here's how skills show up in our day-to-day:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Research and reporting.&lt;/strong&gt; We use skills that guide Claude through multi-step research workflows, pulling data from the web, structuring findings, and producing reports that are 30+ pages long. What used to take a full day of manual work now takes under an hour, and the output follows our formatting standards every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content creation.&lt;/strong&gt; Our SEO content skill teaches the AI how to write for both search engines and AI answer engines, following our internal guidelines for keyword placement, structure, and tone. It even checks for common AI-sounding phrases and flags them before we publish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code and development.&lt;/strong&gt; Our &lt;a href="https://224industries.com.au/webflow-skills" rel="noopener noreferrer"&gt;open-source Webflow agent skills&lt;/a&gt; give coding agents accurate documentation for Webflow's APIs. Before we built these, agents would hallucinate methods that don't exist. Now they produce working code on the first pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data analysis.&lt;/strong&gt; We have a CSV analysis skill that turns raw data exports into clear statistical summaries with visualisations, using our preferred tools and formatting conventions.&lt;/p&gt;

&lt;p&gt;The pattern is the same every time: teach the AI once, use it repeatedly, get better results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Webflow Agent Skills (Open Source)
&lt;/h2&gt;

&lt;p&gt;We released &lt;a href="https://224industries.com.au/webflow-skills" rel="noopener noreferrer"&gt;five Webflow agent skills&lt;/a&gt; as open source because we saw a gap nobody was filling. AI coding agents are powerful, but they had zero context on how Webflow's APIs actually work. The result was hallucinated code and wasted time.&lt;/p&gt;

&lt;p&gt;Our skills cover the &lt;strong&gt;Designer API&lt;/strong&gt; (building extensions and using the API Playground), the &lt;strong&gt;Browser API&lt;/strong&gt; (consent management and tracking), &lt;strong&gt;Code Components&lt;/strong&gt; (React components via DevLink), &lt;strong&gt;Webhooks&lt;/strong&gt; (signature verification and event handling), and the &lt;strong&gt;Enterprise API&lt;/strong&gt; (workspace management and audit logs).&lt;/p&gt;

&lt;p&gt;Each skill follows the open Agent Skills standard and works with Claude everywhere (e.g. web, Cowork, and Code), Cursor, GitHub Copilot, OpenAI Codex, Gemini CLI, and any other compatible agent. They're MIT-licensed and free.&lt;/p&gt;

&lt;p&gt;The response from the Webflow community has been positive. After building them for our internal workflow, we realised other agencies and developers would face the same problems. Open-sourcing them was the obvious next step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Skills as a Lead Magnet
&lt;/h2&gt;

&lt;p&gt;Here's something most businesses haven't figured out yet: agent skills make excellent lead magnets.&lt;/p&gt;

&lt;p&gt;If your company has expertise in a specific domain, you can package that knowledge into a skill and offer it as a free download. The people who want it are exactly your target audience: they use AI tools, they work in your industry, and they're actively looking for ways to get better results.&lt;/p&gt;

&lt;p&gt;Take our Webflow skills. Every developer or agency that installs them is someone who builds on Webflow. That's our core audience, discovering our brand through a tool that genuinely helps them.&lt;/p&gt;

&lt;p&gt;Compare that to a generic PDF ebook that sits in someone's downloads folder unopened. A skill is something people actually use, repeatedly, inside the tools they already work with. The brand exposure compounds every time someone runs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selling and Distributing Skills Privately
&lt;/h2&gt;

&lt;p&gt;Free skills work for lead generation. But there's also a real opportunity to sell premium skills.&lt;/p&gt;

&lt;p&gt;If you've spent months refining a workflow (your content strategy, your QA process, your reporting framework), that expertise has value. Packaging it as a skill and distributing it privately, whether through direct sales, a membership, or as part of a service offering, gives clients something tangible beyond a PDF process document.&lt;/p&gt;

&lt;p&gt;A few ways this could work: an SEO agency sells a content brief skill that generates briefs matching their methodology. A design studio offers a brand guidelines skill that teaches AI to apply their client's visual identity correctly. A consultancy bundles custom skills as part of their retainer.&lt;/p&gt;

&lt;p&gt;The format is simple enough that anyone can build a skill, but the knowledge inside it is what makes it valuable. That's a hard combination to copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Can Help You Build Your Own
&lt;/h2&gt;

&lt;p&gt;This is where we come in. At &lt;a href="https://224industries.com.au/info" rel="noopener noreferrer"&gt;224 Industries&lt;/a&gt;, we don't just build skills for our own use. We help brands create agent skills that match their workflows, capture their expertise, and improve how their teams work with AI.&lt;/p&gt;

&lt;p&gt;That could look like building a set of custom skills for your marketing team so your AI-generated content always hits the mark. It could mean creating a skill-based lead magnet that attracts your ideal audience. Or it could be packaging your agency's methodology into skills you distribute to clients.&lt;/p&gt;

&lt;p&gt;We handle the strategy, the skill architecture, and the testing to make sure the output actually meets your standards. We've been through the trial and error already (our early skills were too long, too vague, and too generic before we dialled in what works).&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Is Heading
&lt;/h2&gt;

&lt;p&gt;Agent skills are still early. Anthropic launched them in October 2025 and opened the standard in December. But the trajectory is clear: AI agents are moving from general-purpose assistants to specialised tools that know how to do specific jobs well.&lt;/p&gt;

&lt;p&gt;The businesses that invest in skills now (building them, using them, distributing them) will have a serious head start. Not because the technology is complicated, but because the hard part is the knowledge and the workflows that go inside them.&lt;/p&gt;

&lt;p&gt;If you're curious about what agent skills could look like for your team, &lt;a href="https://224industries.com.au/contact" rel="noopener noreferrer"&gt;book a call with us&lt;/a&gt;. We'll walk you through the possibilities and figure out where skills would have the biggest impact on your work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What are agent skills?
&lt;/h3&gt;

&lt;p&gt;Agent skills are folders of instructions, scripts, and reference docs that AI agents load when they need specific knowledge to complete a task. They follow an open standard and work across tools like Claude, Cursor, GitHub Copilot, and others.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to be technical to use agent skills?
&lt;/h3&gt;

&lt;p&gt;No. You can use pre-built skills in Claude's web and desktop apps without writing a single line of code. Creating custom skills does involve some setup, but the format is designed to be readable and editable by anyone.&lt;/p&gt;

&lt;h3&gt;
  
  
  What AI tools support agent skills?
&lt;/h3&gt;

&lt;p&gt;The open Agent Skills standard is supported by Claude (web, desktop, API, and Claude Code), Cursor, GitHub Copilot, OpenAI Codex, Gemini CLI, OpenCode, Factory Droid, and a growing number of other AI tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use agent skills as a lead magnet?
&lt;/h3&gt;

&lt;p&gt;Yes. Skills make strong lead magnets because they're useful tools people actually return to, not static content that gets downloaded once and forgotten. If your target audience uses AI tools, a free skill that helps them do their job better is an effective way to reach them.&lt;/p&gt;

&lt;h3&gt;
  
  
  How can 224 Industries help with agent skills?
&lt;/h3&gt;

&lt;p&gt;We build custom agent skills for brands, create skill-based lead magnets, and help teams integrate skills into their workflows. We also maintain open-source &lt;a href="https://224industries.com.au/webflow-skills" rel="noopener noreferrer"&gt;Webflow agent skills&lt;/a&gt; used by developers and agencies worldwide.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to Bulk-Invite Members and Assign Plans with Memberstack CLI</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Tue, 24 Feb 2026 05:14:50 +0000</pubDate>
      <link>https://forem.com/224industries/how-to-bulk-invite-members-and-assign-plans-with-memberstack-cli-2m3k</link>
      <guid>https://forem.com/224industries/how-to-bulk-invite-members-and-assign-plans-with-memberstack-cli-2m3k</guid>
      <description>&lt;p&gt;You can onboard an entire list of members into Memberstack from a single CSV file using the &lt;a href="https://memberstack-cli.flashbrew.digital/" rel="noopener noreferrer"&gt;Memberstack CLI&lt;/a&gt;. No dashboard clicking, no manual data entry. If you're running a course launch, onboarding event attendees, or migrating a list of users from a spreadsheet, this is the fastest way to get them all into your membership site with the right plans attached.&lt;/p&gt;

&lt;p&gt;If you're using an AI agent like Claude Code or Codex, you can hand it this guide and it'll run the whole workflow for you.&lt;/p&gt;

&lt;p&gt;This guide covers the full process: install the CLI, prepare your CSV, import your members, and verify the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Need
&lt;/h2&gt;

&lt;p&gt;Before you start, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js v20 or higher&lt;/strong&gt; installed on your machine. Check with &lt;code&gt;node --version&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Memberstack account&lt;/strong&gt; with at least one app created. Sign up free at &lt;a href="https://www.memberstack.com/" rel="noopener noreferrer"&gt;memberstack.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A CSV or JSON file&lt;/strong&gt; with the members you want to import (we'll cover the format below).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A terminal&lt;/strong&gt; (or an AI agent with terminal access like Claude Code, Codex, Cursor, or Gemini CLI).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're using an AI agent, install the Agent Skill so the agent knows how to use the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add Flash-Brew-Digital/memberstack-skills &lt;span class="nt"&gt;--skill&lt;/span&gt; memberstack-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1: Install and Authenticate
&lt;/h2&gt;

&lt;p&gt;Install Memberstack CLI globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; memberstack-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then log in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens your browser to the Memberstack OAuth page, where you'll choose which application to connect. Your credentials are stored locally and never leave your machine.&lt;/p&gt;

&lt;p&gt;Verify it worked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack &lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see your email, app ID, and current environment (sandbox by default).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Check Your Plans
&lt;/h2&gt;

&lt;p&gt;Before importing members, you need the plan IDs you want to assign. List your existing plans:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack plans list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prints a table of all your plans with their IDs, names, and statuses. Grab the plan ID (it looks like &lt;code&gt;pln_abc123&lt;/code&gt;) for any plan you want to assign to your imported members.&lt;/p&gt;

&lt;p&gt;Don't have the right plan yet? Create one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack plans create &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Workshop Attendee"&lt;/span&gt; &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Access for workshop participants"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI prints the new plan's ID when it's created. Copy that for the next step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Prepare Your CSV File
&lt;/h2&gt;

&lt;p&gt;Your import file needs two required columns: &lt;code&gt;email&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt;. To assign plans during import, add a &lt;code&gt;plans&lt;/code&gt; column with comma-separated plan IDs.&lt;/p&gt;

&lt;p&gt;Here's a sample &lt;code&gt;members.csv&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;email,password,plans,customFields.firstName,customFields.lastName,customFields.company
alice@example.com,temp-Pass1!,pln_abc123,Alice,Chen,Acme Corp
bob@example.com,temp-Pass2!,pln_abc123,Bob,Martinez,Globex
carol@example.com,temp-Pass3!,"pln_abc123,pln_xyz789",Carol,Johnson,Initech
dave@example.com,temp-Pass4!,pln_abc123,Dave,Wilson,Umbrella Co
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things to note about the format:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;email&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; are required for every row.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;plans&lt;/code&gt; column accepts one or more plan IDs, separated by commas. Wrap the value in quotes if you're assigning multiple plans (like Carol's row above).&lt;/li&gt;
&lt;li&gt;Custom fields use the &lt;code&gt;customFields.*&lt;/code&gt; prefix. These map directly to the custom fields you've set up in Memberstack.&lt;/li&gt;
&lt;li&gt;You can also include &lt;code&gt;metaData.*&lt;/code&gt; columns for metadata and a &lt;code&gt;loginRedirect&lt;/code&gt; column for per-member redirect URLs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're using an AI agent, you can skip building the CSV by hand. Just tell it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I have a list of 50 attendees in a Google Sheet. Export it as CSV, make sure it has email, password, plans, and name columns, then format it for Memberstack CLI import."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent will handle the column mapping and formatting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Import Your Members
&lt;/h2&gt;

&lt;p&gt;Run the import:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members import &lt;span class="nt"&gt;--file&lt;/span&gt; members.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI reads each row, creates the member, and assigns the specified plans. You'll see a progress spinner while it works through the file.&lt;/p&gt;

&lt;p&gt;JSON files work too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members import &lt;span class="nt"&gt;--file&lt;/span&gt; members.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a JSON import, structure the file as an array of objects with the same field names.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Verify the Import
&lt;/h2&gt;

&lt;p&gt;Check that your members came through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members list &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--all&lt;/code&gt; flag auto-paginates so you see every member, not just the first page. For a quick count:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members count
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want to confirm a specific member? Look them up by email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members get alice@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shows their full profile including assigned plans, custom fields, and metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Assign Plans After Import (Optional)
&lt;/h2&gt;

&lt;p&gt;If you imported members without plans (or need to add a plan to existing members later), you have two options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add a plan to a single member:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members add-plan mem_abc123 &lt;span class="nt"&gt;--plan-id&lt;/span&gt; pln_xyz789
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add a plan to all members who don't have one yet:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members bulk-add-plan &lt;span class="nt"&gt;--plan&lt;/span&gt; pln_abc123 &lt;span class="nt"&gt;--filter&lt;/span&gt; no-plan &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--dry-run&lt;/code&gt; flag previews the changes without applying them. Remove it when you're ready to commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members bulk-add-plan &lt;span class="nt"&gt;--plan&lt;/span&gt; pln_abc123 &lt;span class="nt"&gt;--filter&lt;/span&gt; no-plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Working with Live vs Sandbox
&lt;/h2&gt;

&lt;p&gt;All commands run against your &lt;strong&gt;sandbox&lt;/strong&gt; (test mode) environment by default. This is the right place to test your import before going live.&lt;/p&gt;

&lt;p&gt;Once you're happy with the results, run the same commands against your live environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members import &lt;span class="nt"&gt;--file&lt;/span&gt; members.csv &lt;span class="nt"&gt;--live&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use the full flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members import &lt;span class="nt"&gt;--file&lt;/span&gt; members.csv &lt;span class="nt"&gt;--mode&lt;/span&gt; live
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quick Tips
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Export first, then re-import.&lt;/strong&gt; If you need to update a batch of members later, export them, edit the file, and use bulk-update:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt; csv &lt;span class="nt"&gt;--output&lt;/span&gt; current-members.csv
&lt;span class="c"&gt;# edit the file...&lt;/span&gt;
memberstack members bulk-update &lt;span class="nt"&gt;--file&lt;/span&gt; current-members.csv &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pipe JSON for scripting.&lt;/strong&gt; Add &lt;code&gt;--json&lt;/code&gt; to any command to get raw JSON output. This is useful for chaining commands or feeding data into other tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members list &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt; | jq &lt;span class="s1"&gt;'.[] | .email'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stats at a glance.&lt;/strong&gt; After a big import, check your member breakdown by plan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack members stats
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What file formats does Memberstack CLI accept for imports?
&lt;/h3&gt;

&lt;p&gt;The CLI accepts both CSV and JSON files. CSV files should use &lt;code&gt;customFields.*&lt;/code&gt; and &lt;code&gt;metaData.*&lt;/code&gt; prefixes for nested data. JSON files use an array of objects with the same field names.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I assign multiple plans to a member during import?
&lt;/h3&gt;

&lt;p&gt;Yes. In a CSV file, list the plan IDs in the &lt;code&gt;plans&lt;/code&gt; column separated by commas and wrap them in quotes. In a JSON file, use an array of plan ID strings.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens if I import a member that already exists?
&lt;/h3&gt;

&lt;p&gt;The import will fail for that row and continue processing the remaining members. The CLI reports which rows succeeded and which failed so you can fix and re-run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a limit to how many members I can import at once?
&lt;/h3&gt;

&lt;p&gt;There's no hard limit on the file size. The CLI processes members sequentially and respects Memberstack's API rate limits automatically. Large imports (thousands of members) will take longer but will complete without issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I test the import before going live?
&lt;/h3&gt;

&lt;p&gt;All commands target the sandbox environment by default. Run your import there first, verify the results, then re-run with the &lt;code&gt;--live&lt;/code&gt; flag to push to your live environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Memberstack CLI lets you import members from a CSV or JSON file in a single command.&lt;/li&gt;
&lt;li&gt;You can assign plans, set custom fields, and add metadata during import.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;--dry-run&lt;/code&gt; flag on bulk operations lets you preview changes before committing.&lt;/li&gt;
&lt;li&gt;Sandbox mode (the default) is the safe place to test imports before going live.&lt;/li&gt;
&lt;li&gt;AI agents like Claude Code and Codex can run this entire workflow from a single prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://memberstack-cli.flashbrew.digital/" rel="noopener noreferrer"&gt;Memberstack CLI Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://memberstack-cli.flashbrew.digital/docs/members" rel="noopener noreferrer"&gt;Members Command Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://memberstack-cli.flashbrew.digital/docs/plans" rel="noopener noreferrer"&gt;Plans Command Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://memberstack-cli.flashbrew.digital/docs/agent-skills" rel="noopener noreferrer"&gt;Agent Skills Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Five Webflow Agent Skills So AI Coding Agents Can Actually Work With Webflow</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Tue, 24 Feb 2026 00:20:45 +0000</pubDate>
      <link>https://forem.com/224industries/five-webflow-agent-skills-so-ai-coding-agents-can-actually-work-with-webflow-413h</link>
      <guid>https://forem.com/224industries/five-webflow-agent-skills-so-ai-coding-agents-can-actually-work-with-webflow-413h</guid>
      <description>&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%2Fioe7wislbyn4by9t3620.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%2Fioe7wislbyn4by9t3620.png" alt="Vercel Skills CLI output from installing the Webflow Agent Skills by 224 Industries" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Webflow Agent Skills by 224 Industries
&lt;/h2&gt;

&lt;p&gt;AI coding agents are good at writing code. They're not so good at writing code for platforms they don't know much about. If you've ever asked Claude Code or Cursor to build a Webflow Designer Extension and received a hallucinated API that doesn't exist, you know what I mean.&lt;/p&gt;

&lt;p&gt;We built five open-source &lt;a href="https://agentskills.io/home.md" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; that give coding agents the context they need to work with Webflow properly. They're MIT-licensed, free, and work across any agent that supports the open Agent Skills standard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://224industries.com.au/webflow-skills" rel="noopener noreferrer"&gt;See the five skills&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Agent Skills?
&lt;/h2&gt;

&lt;p&gt;Agent Skills are folders of instructions, scripts, and reference docs that AI agents can discover and load on demand. Think of them as knowledge packs. When an agent encounters a task it doesn't have enough context for (like building a Webflow Designer Extension), it reads the relevant skill and gets up to speed.&lt;/p&gt;

&lt;p&gt;The format was originally developed by &lt;a href="https://www.anthropic.com/" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt; and released as an open standard. It's now supported by a growing list of agent products including OpenAI Codex, Claude Code, Cursor, GitHub Copilot, Gemini CLI, OpenCode, Roo Code, Factory's Droid, and many others.&lt;/p&gt;

&lt;p&gt;Each skill contains a &lt;code&gt;SKILL.md&lt;/code&gt; file (the entry point), reference documentation, and helper scripts. Agents parse these files to understand how an API works, what patterns to follow, and what mistakes to avoid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Built These
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://224industries.com.au/info" rel="noopener noreferrer"&gt;224 Industries&lt;/a&gt; is a Webflow Premium Partner based in Brisbane, Australia. Since 2016, we've been building marketing websites for tech and SaaS companies like &lt;a href="https://224industries.com.au/work/easy-agile" rel="noopener noreferrer"&gt;Easy Agile&lt;/a&gt;, &lt;a href="https://224industries.com.au/work/clear-dynamics" rel="noopener noreferrer"&gt;Clear Dynamics&lt;/a&gt;, and &lt;a href="https://224industries.com.au/work/giraffe" rel="noopener noreferrer"&gt;Giraffe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We use AI coding agents daily in our development workflow. The problem? Webflow's APIs are well-documented on their site, but agents don't have that documentation in their context window when they're writing code. The result is guesswork, hallucinated methods, and broken output.&lt;/p&gt;

&lt;p&gt;Agent Skills fix this. Instead of agents guessing how the Webflow Designer API works, they can read accurate, structured reference docs at the point they need them. Our team's output quality improved immediately after we started using these skills internally, so we decided to open-source them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five Skills
&lt;/h2&gt;

&lt;p&gt;Here's what we released:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. webflow-designer-api
&lt;/h3&gt;

&lt;p&gt;Work with the Webflow Designer API, either by building Designer Extensions (iframes inside the Webflow Designer) or by generating code snippets for the Designer API Playground. Covers element manipulation, styles, components, pages, variables, assets, error handling, CLI usage, and UI design patterns.&lt;/p&gt;

&lt;p&gt;This is the skill we use most. It includes references for every &lt;code&gt;webflow.*&lt;/code&gt; method, plus workflow-specific guides for building extensions vs. prototyping in the Playground.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. webflow-browser-api
&lt;/h3&gt;

&lt;p&gt;Control Webflow Analyze and Optimize from JavaScript via the Browser API. Covers the global &lt;code&gt;wf&lt;/code&gt; object, consent management (with CMP integrations for OneTrust and TrustArc), experiment variation tracking, and custom visitor attributes.&lt;/p&gt;

&lt;p&gt;Useful when you need to manage tracking consent, integrate a CMP, or personalise experiences based on visitor attributes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. webflow-code-components
&lt;/h3&gt;

&lt;p&gt;Build, define, and import React code components into Webflow using DevLink. Covers &lt;code&gt;declareComponent&lt;/code&gt; definitions, all 11 prop types, Shadow DOM styling, Webpack bundling, SSR behaviour, and the CLI import workflow.&lt;/p&gt;

&lt;p&gt;If you're building custom React components for Webflow, this skill gives agents full context on how DevLink works, from prop type definitions to framework-specific styling guides for Tailwind, Emotion, Material UI, and others.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. webflow-webhooks
&lt;/h3&gt;

&lt;p&gt;Receive and verify Webflow webhooks. Includes HMAC-SHA256 signature verification, all 14 event types with payload schemas, setup guides for both dashboard and API-created webhooks, and common debugging patterns.&lt;/p&gt;

&lt;p&gt;The skill includes working code examples for Express.js webhook handlers with proper signature verification and timestamp validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. webflow-enterprise-api
&lt;/h3&gt;

&lt;p&gt;Enterprise-only API endpoints for workspace management, audit logs, site activity, 301 redirects, robots.txt configuration, and well-known files. Covers all endpoints, required scopes, and pagination.&lt;/p&gt;

&lt;p&gt;This one is only relevant if you're on a Webflow Enterprise workspace, but it fills a gap where agents otherwise have zero context on these endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Install
&lt;/h2&gt;

&lt;p&gt;The fastest way is with the &lt;a href="https://skills.sh/" rel="noopener noreferrer"&gt;Vercel skills CLI&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install all five skills&lt;/span&gt;
npx skills add 224-industries/webflow-skills

&lt;span class="c"&gt;# Install just one&lt;/span&gt;
npx skills add 224-industries/webflow-skills &lt;span class="nt"&gt;--skill&lt;/span&gt; webflow-designer-api

&lt;span class="c"&gt;# See what's available&lt;/span&gt;
npx skills add 224-industries/webflow-skills &lt;span class="nt"&gt;--list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're using Claude Code or &lt;a href="https://factory.ai/news/terminal-bench" rel="noopener noreferrer"&gt;Factory's Droid&lt;/a&gt;, you can add them as a plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin add 224-industries/webflow-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They also work with the CLIs by &lt;a href="https://playbooks.com/skills" rel="noopener noreferrer"&gt;Playbooks&lt;/a&gt; and &lt;a href="https://context7.com/docs/skills" rel="noopener noreferrer"&gt;Context7&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Playbooks&lt;/span&gt;
npx playbooks add skill 224-industries/webflow-skills

&lt;span class="c"&gt;# Context7&lt;/span&gt;
npx ctx7 skills &lt;span class="nb"&gt;install&lt;/span&gt; /224-industries/webflow-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How They're Structured
&lt;/h2&gt;

&lt;p&gt;Each skill follows the &lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;Agent Skills specification&lt;/a&gt;. The structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;skills/webflow-designer-api/
├── SKILL.md                    # Entry point with overview and reference index
├── references/                 # Detailed API docs, guides, and examples
│   ├── elements-api.md
│   ├── styles-api.md
│   ├── components-api.md
│   └── ...
├── scripts/
│   └── search_references.py    # Search references by tag or keyword
└── assets/
    └── webflow-variables.css   # Design system variables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;SKILL.md&lt;/code&gt; file acts as a table of contents. It gives the agent a high-level overview and tells it where to find detailed reference docs. Agents typically read the skill file first, then pull in the specific references they need for the task at hand.&lt;/p&gt;

&lt;p&gt;Every reference file includes YAML frontmatter with &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, and &lt;code&gt;tags&lt;/code&gt; so agents (and humans) can search across them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python scripts/search_references.py &lt;span class="nt"&gt;--search&lt;/span&gt; &lt;span class="s2"&gt;"consent"&lt;/span&gt;
python scripts/search_references.py &lt;span class="nt"&gt;--tag&lt;/span&gt; &lt;span class="s2"&gt;"styles"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What We Learned Building These
&lt;/h2&gt;

&lt;p&gt;A few things stood out during development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concise beats comprehensive.&lt;/strong&gt; Early versions of our skills were too long. Agents have limited context windows, and stuffing every edge case into one file made them slower and less accurate. Breaking content into focused reference files that agents load on demand produced better results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structure matters more than prose.&lt;/strong&gt; Tables, code examples, and clear headings are more useful to agents than paragraphs of explanation. Agents parse structured content faster and produce more accurate code when they can pattern-match against examples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontmatter enables discoverability.&lt;/strong&gt; Adding tags and descriptions to every reference file lets agents search for what they need rather than reading everything. The search scripts in each skill make this even easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;The repo is open for contributions. If you spot inaccuracies, want to add more examples, or have ideas for new Webflow-related skills, PRs are welcome.&lt;/p&gt;

&lt;p&gt;You can also use the included script to scaffold new skills:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node scripts/add-skill.js &amp;lt;skill-name&amp;gt; &lt;span class="s2"&gt;"&amp;lt;description&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates the folder structure and updates all manifest files automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What agents support Agent Skills?
&lt;/h3&gt;

&lt;p&gt;The Agent Skills format is supported by Claude Code, Cursor, GitHub Copilot (via VS Code), Gemini CLI, Roo Code, OpenHands, Goose, Factory Droid, and many more. The full list of compatible agents is available on &lt;a href="https://agentskills.io/home.md" rel="noopener noreferrer"&gt;agentskills.io&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need a Webflow Enterprise plan to use these skills?
&lt;/h3&gt;

&lt;p&gt;No. Four of the five skills work with any Webflow plan. The &lt;code&gt;webflow-enterprise-api&lt;/code&gt; skill covers Enterprise-only endpoints, so you'll need an Enterprise workspace for that one. The &lt;code&gt;webflow-browser-api&lt;/code&gt; skill requires Analyze or Optimize to be enabled on your site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use these skills without Claude Code?
&lt;/h3&gt;

&lt;p&gt;Yes. Agent Skills are an open standard and work with any compatible agent. You can install them with the &lt;code&gt;npx skills&lt;/code&gt; CLI, Playbooks, or Context7, depending on which agent you're using.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are these officially maintained by Webflow?
&lt;/h3&gt;

&lt;p&gt;No. These skills are built and maintained by &lt;a href="https://224industries.com.au/info.md" rel="noopener noreferrer"&gt;224 Industries&lt;/a&gt;, a Webflow Premium Partner. The reference content is sourced from Webflow's official documentation and kept up to date by our team.&lt;/p&gt;




&lt;h2&gt;
  
  
  npx build-skill
&lt;/h2&gt;

&lt;p&gt;Build your own Agent Skills with &lt;a href="https://dev.to/bensabic/i-built-npx-build-skill-heres-why-you-should-use-it-2ag6"&gt;npx build-skill&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Memberstack Agent Skills
&lt;/h2&gt;

&lt;p&gt;Integrate &lt;a href="https://github.com/Flash-Brew-Digital/memberstack-skills" rel="noopener noreferrer"&gt;Memberstack Agent Skills&lt;/a&gt; for the &lt;a href="https://memberstack-cli.flashbrew.digital" rel="noopener noreferrer"&gt;Memberstack CLI&lt;/a&gt; and other parts of Memberstack ecosystem. The perfect skills for those building on Webflow and Memberstack.&lt;/p&gt;




&lt;p&gt;Built by &lt;a href="https://bensabic.dev" rel="noopener noreferrer"&gt;Ben Sabic&lt;/a&gt;, Fractional CTO at &lt;a href="https://224industries.com.au" rel="noopener noreferrer"&gt;224 Industries&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webflow</category>
      <category>opensource</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Scrape Web Data and Import It into Memberstack with Firecrawl CLI</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Mon, 23 Feb 2026 12:49:34 +0000</pubDate>
      <link>https://forem.com/bensabic/how-to-scrape-web-data-and-import-it-into-memberstack-with-firecrawl-cli-21n1</link>
      <guid>https://forem.com/bensabic/how-to-scrape-web-data-and-import-it-into-memberstack-with-firecrawl-cli-21n1</guid>
      <description>&lt;p&gt;You can pull content from any website and load it straight into your Memberstack data tables using two CLI tools: &lt;a href="https://www.firecrawl.dev/" rel="noopener noreferrer"&gt;Firecrawl&lt;/a&gt; for scraping and &lt;a href="https://memberstack-cli.flashbrew.digital/" rel="noopener noreferrer"&gt;Memberstack CLI&lt;/a&gt; for the import. No backend code needed. If you're using an AI agent like Claude Code or Codex, you can hand it this guide and it will run the whole workflow for you.&lt;/p&gt;

&lt;p&gt;This guide walks through each step, from installation to a working import, with real commands you can copy and run. All three walkthroughs (scrape a single page, crawl a full site, and search the web) follow the same pattern: pull the data, shape it, import it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Need
&lt;/h2&gt;

&lt;p&gt;Before you start, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js v18 or higher&lt;/strong&gt; installed on your machine. Check with &lt;code&gt;node --version&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Firecrawl account&lt;/strong&gt; for web scraping. Sign up free at &lt;a href="https://www.firecrawl.dev/" rel="noopener noreferrer"&gt;firecrawl.dev&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Memberstack account&lt;/strong&gt; to store the data. Sign up free at &lt;a href="https://www.memberstack.com/" rel="noopener noreferrer"&gt;memberstack.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A terminal&lt;/strong&gt; (or an AI agent with terminal access like Claude Code, Codex, Cursor, or Gemini CLI).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're using an AI agent, install both Agent Skills so the agent knows how to use these tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add Flash-Brew-Digital/memberstack-skills &lt;span class="nt"&gt;--skill&lt;/span&gt; memberstack-cli
npx skills add firecrawl/cli &lt;span class="nt"&gt;--skill&lt;/span&gt; firecrawl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1: Install Both CLIs
&lt;/h2&gt;

&lt;p&gt;Install Firecrawl CLI and Memberstack CLI globally with a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; firecrawl-cli memberstack-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check that both are working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firecrawl &lt;span class="nt"&gt;--version&lt;/span&gt;
memberstack &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Authenticate
&lt;/h2&gt;

&lt;p&gt;Authenticate with both services. Each tool stores credentials locally so you only do this once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firecrawl:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firecrawl login &lt;span class="nt"&gt;--browser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens your browser to sign in and link your API key. For AI agents, the &lt;code&gt;--browser&lt;/code&gt; flag handles this without manual prompting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memberstack:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens the Memberstack OAuth page, where you'll be prompted to choose a Memberstack application.&lt;/p&gt;

&lt;p&gt;Verify both are connected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firecrawl &lt;span class="nt"&gt;--status&lt;/span&gt;
memberstack &lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Scrape Your Source Data
&lt;/h2&gt;

&lt;p&gt;Here's where Firecrawl does its work. Choose the approach that matches what you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A: Scrape a Single Page
&lt;/h3&gt;

&lt;p&gt;Pull clean content from one URL. Good for grabbing a product page, directory listing, or article.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firecrawl scrape https://example.com/products &lt;span class="nt"&gt;--only-main-content&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; .firecrawl/products.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--only-main-content&lt;/code&gt; flag strips out navigation, footers, and ads, leaving just the useful content.&lt;/p&gt;

&lt;p&gt;For structured data like links and metadata alongside the markdown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firecrawl scrape https://example.com/products &lt;span class="nt"&gt;--format&lt;/span&gt; markdown,links &lt;span class="nt"&gt;--pretty&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; .firecrawl/products.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option B: Crawl an Entire Site Section
&lt;/h3&gt;

&lt;p&gt;When you need content from multiple pages, like all docs or all blog posts on a site, use crawl.&lt;/p&gt;

&lt;p&gt;First, discover what pages exist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firecrawl map https://example.com &lt;span class="nt"&gt;--search&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; .firecrawl/product-urls.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then crawl the section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firecrawl crawl https://example.com &lt;span class="nt"&gt;--include-paths&lt;/span&gt; /products &lt;span class="nt"&gt;--limit&lt;/span&gt; 50 &lt;span class="nt"&gt;--wait&lt;/span&gt; &lt;span class="nt"&gt;--progress&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; .firecrawl/crawl-results.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--wait&lt;/code&gt; flag keeps the command running until the crawl finishes. &lt;code&gt;--progress&lt;/code&gt; shows you how far along it is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option C: Search the Web and Scrape Results
&lt;/h3&gt;

&lt;p&gt;If you don't have a specific URL yet, search for what you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firecrawl search &lt;span class="s2"&gt;"organic coffee suppliers wholesale"&lt;/span&gt; &lt;span class="nt"&gt;--scrape&lt;/span&gt; &lt;span class="nt"&gt;--scrape-formats&lt;/span&gt; markdown &lt;span class="nt"&gt;--pretty&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; .firecrawl/coffee-suppliers.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--scrape&lt;/code&gt; flag tells Firecrawl to not just return search results, but also scrape the content from each result page. That gives you full page content to work with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Prepare the Data for Memberstack
&lt;/h2&gt;

&lt;p&gt;Memberstack's &lt;a href="https://memberstack-cli.flashbrew.digital/docs/records" rel="noopener noreferrer"&gt;records import&lt;/a&gt; accepts CSV or JSON files. You need to shape your scraped data to match the table columns you want in Memberstack.&lt;/p&gt;

&lt;p&gt;Here's where an AI agent really shines. If you're using Claude Code, Codex, or a similar agent, you can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Read the scraped data in &lt;code&gt;.firecrawl/crawl-results.json&lt;/code&gt;, extract the page titles, URLs, and descriptions, and create a CSV file with columns: title, url, description."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent will write a small script to transform the data. That's it. No coding on your part.&lt;/p&gt;

&lt;p&gt;If you prefer to do it yourself, here's a quick example using &lt;code&gt;jq&lt;/code&gt; (a command-line JSON tool):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Extract data from a crawl result into CSV format&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"title,url,description"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; import-data.csv
jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.data[] | [.metadata.title, .metadata.sourceURL, .metadata.description] | @csv'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  .firecrawl/crawl-results.json &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; import-data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your CSV file should look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;title,url,description
"Organic Beans Co","https://example.com/products/beans","Fair-trade organic coffee beans"
"Mountain Roast","https://example.com/products/roast","Single-origin dark roast"
"Sunrise Blend","https://example.com/products/blend","Morning blend with notes of chocolate"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For JSON imports, format the data as an array of objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Organic Beans Co"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/products/beans"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fair-trade organic coffee beans"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mountain Roast"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/products/roast"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Single-origin dark roast"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Create a Memberstack Data Table
&lt;/h2&gt;

&lt;p&gt;Before importing, you need a table in Memberstack to hold the data. Create one from the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack tables create &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Products"&lt;/span&gt; &lt;span class="nt"&gt;--key&lt;/span&gt; products &lt;span class="nt"&gt;--read-rule&lt;/span&gt; PUBLIC &lt;span class="nt"&gt;--create-rule&lt;/span&gt; ADMIN_ONLY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://memberstack-cli.flashbrew.digital/docs/tables" rel="noopener noreferrer"&gt;access rules&lt;/a&gt; control who can interact with the data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PUBLIC&lt;/code&gt; means anyone can read the records, including visitors who aren't logged in.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AUTHENTICATED&lt;/code&gt; requires a logged-in member.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AUTHENTICATED_OWN&lt;/code&gt; limits members to their own records.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ADMIN_ONLY&lt;/code&gt; restricts access to admins.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose the rules that make sense for your use case. A product directory might be public. A members-only resource library might need &lt;code&gt;AUTHENTICATED&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Verify the table was created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack tables list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Import the Data
&lt;/h2&gt;

&lt;p&gt;Now load your prepared file into Memberstack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack records import products &lt;span class="nt"&gt;--file&lt;/span&gt; import-data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or if you used JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack records import products &lt;span class="nt"&gt;--file&lt;/span&gt; import-data.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Your scraped web data is now in a Memberstack data table.&lt;/p&gt;

&lt;p&gt;Check the results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;memberstack records find products &lt;span class="nt"&gt;--take&lt;/span&gt; 5
memberstack records count products
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Putting It All Together
&lt;/h2&gt;

&lt;p&gt;Here's the complete workflow from start to finish. Copy this block and run it, or give it to your AI agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Scrape a website section&lt;/span&gt;
firecrawl crawl https://example.com &lt;span class="nt"&gt;--include-paths&lt;/span&gt; /products &lt;span class="nt"&gt;--limit&lt;/span&gt; 50 &lt;span class="nt"&gt;--wait&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; .firecrawl/crawl-results.json

&lt;span class="c"&gt;# 2. Transform the data into CSV&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"title,url,description"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; import-data.csv
jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.data[] | [.metadata.title, .metadata.sourceURL, .metadata.description] | @csv'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  .firecrawl/crawl-results.json &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; import-data.csv

&lt;span class="c"&gt;# 3. Create a Memberstack table&lt;/span&gt;
memberstack tables create &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Products"&lt;/span&gt; &lt;span class="nt"&gt;--key&lt;/span&gt; products &lt;span class="nt"&gt;--read-rule&lt;/span&gt; PUBLIC &lt;span class="nt"&gt;--create-rule&lt;/span&gt; ADMIN_ONLY

&lt;span class="c"&gt;# 4. Import the records&lt;/span&gt;
memberstack records import products &lt;span class="nt"&gt;--file&lt;/span&gt; import-data.csv

&lt;span class="c"&gt;# 5. Verify&lt;/span&gt;
memberstack records count products
memberstack records find products &lt;span class="nt"&gt;--take&lt;/span&gt; 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  For AI Agents: How to Run This Workflow
&lt;/h2&gt;

&lt;p&gt;If you're an AI agent reading this page (or a person who wants to delegate this to an agent), here's the summary:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;npm install -g firecrawl-cli memberstack-cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authenticate:&lt;/strong&gt; &lt;code&gt;firecrawl login --browser&lt;/code&gt; and &lt;code&gt;memberstack auth login&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scrape:&lt;/strong&gt; Use &lt;code&gt;firecrawl scrape&lt;/code&gt;, &lt;code&gt;firecrawl crawl&lt;/code&gt;, or &lt;code&gt;firecrawl search --scrape&lt;/code&gt; to get the source data. Save output to a file with &lt;code&gt;-o&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transform:&lt;/strong&gt; Read the scraped JSON/markdown and reshape it into a CSV or JSON file matching the target table columns. Column headers become field keys in Memberstack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create table:&lt;/strong&gt; &lt;code&gt;memberstack tables create --name "Your Table" --key your-table --read-rule PUBLIC --create-rule ADMIN_ONLY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import:&lt;/strong&gt; &lt;code&gt;memberstack records import your-table --file your-data.csv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify:&lt;/strong&gt; &lt;code&gt;memberstack records count your-table&lt;/code&gt; and &lt;code&gt;memberstack records find your-table --take 5&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the Firecrawl CLI, run &lt;code&gt;firecrawl --help&lt;/code&gt; or &lt;code&gt;firecrawl &amp;lt;command&amp;gt; --help&lt;/code&gt; for full option details. For the Memberstack CLI, run &lt;code&gt;memberstack --help&lt;/code&gt; or see the &lt;a href="https://memberstack-cli.flashbrew.digital/docs/commands" rel="noopener noreferrer"&gt;command reference&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;p&gt;This scrape-and-import pattern works for a lot of scenarios beyond a simple product directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build a resource library.&lt;/strong&gt; Crawl a collection of industry articles or documentation sites, extract titles, URLs, and summaries, then import them as a curated resource library for your members. Gate access with Memberstack's &lt;code&gt;AUTHENTICATED&lt;/code&gt; read rules so only logged-in members can browse the collection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Populate a supplier or vendor directory.&lt;/strong&gt; Search for businesses in a niche with &lt;code&gt;firecrawl search&lt;/code&gt;, scrape the results to get company names, descriptions, and URLs, and import them into a member-facing directory. Members can browse or filter the data on your Webflow or WordPress frontend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seed a course catalog.&lt;/strong&gt; If you're building an education platform, crawl an existing public course listing site to get course names, descriptions, and categories. Import them as records, then link each to a Memberstack plan so only paid members can access certain courses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migrate content from another platform.&lt;/strong&gt; Crawl your existing site on Teachable, Kajabi, or another platform to extract page content. Reshape it and import it into Memberstack data tables as part of a platform migration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep data fresh.&lt;/strong&gt; Script the whole workflow as a cron job or CI step. Crawl a source site on a schedule, overwrite or update your Memberstack records with &lt;code&gt;memberstack records bulk-update&lt;/code&gt;, and your membership site stays current without manual work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Helpful Flags to Know
&lt;/h2&gt;

&lt;p&gt;A few flags across both CLIs that are especially useful in this workflow:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you want to do&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scrape only the main content (skip nav/footer)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;firecrawl scrape &amp;lt;url&amp;gt; --only-main-content&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wait for JavaScript to finish rendering&lt;/td&gt;
&lt;td&gt;&lt;code&gt;firecrawl scrape &amp;lt;url&amp;gt; --wait-for 3000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Find specific pages on a site before crawling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;firecrawl map &amp;lt;url&amp;gt; --search "keyword"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preview a bulk update before applying it&lt;/td&gt;
&lt;td&gt;&lt;code&gt;memberstack records bulk-update --file data.csv --dry-run&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete old records before re-importing&lt;/td&gt;
&lt;td&gt;&lt;code&gt;memberstack records bulk-delete table-key --where "field equals value"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Export existing records for backup&lt;/td&gt;
&lt;td&gt;&lt;code&gt;memberstack records export table-key --format csv --output backup.csv&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run everything against your test environment&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;--sandbox&lt;/code&gt; to any Memberstack command (this is the default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switch to production&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;--live&lt;/code&gt; to any Memberstack command&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I scrape a website and put the data into Memberstack without coding?
&lt;/h3&gt;

&lt;p&gt;Yes. Both &lt;a href="https://docs.firecrawl.dev/sdks/cli" rel="noopener noreferrer"&gt;Firecrawl CLI&lt;/a&gt; and &lt;a href="https://memberstack-cli.flashbrew.digital/docs/commands" rel="noopener noreferrer"&gt;Memberstack CLI&lt;/a&gt; are terminal tools you can run with simple commands. If you use an AI agent like Claude Code, you can describe what you want in plain English and the agent runs the commands for you. No scripting or programming is required.&lt;/p&gt;

&lt;h3&gt;
  
  
  What data formats does Memberstack accept for record imports?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://memberstack-cli.flashbrew.digital/docs/records" rel="noopener noreferrer"&gt;Memberstack CLI&lt;/a&gt; accepts CSV and JSON files. CSV column headers can use the &lt;code&gt;data.*&lt;/code&gt; prefix or plain field names (both &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;data.title&lt;/code&gt; work). JSON files should be arrays of objects where each key becomes a field name.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Firecrawl work on JavaScript-heavy websites?
&lt;/h3&gt;

&lt;p&gt;Yes. &lt;a href="https://www.firecrawl.dev/" rel="noopener noreferrer"&gt;Firecrawl&lt;/a&gt; handles JavaScript rendering, dynamic content, and single-page applications automatically. Use the &lt;code&gt;--wait-for&lt;/code&gt; flag to give a page extra rendering time, or use &lt;code&gt;firecrawl browser&lt;/code&gt; for sites that need user interaction like clicking pagination buttons or expanding dropdowns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need an API key for both tools?
&lt;/h3&gt;

&lt;p&gt;Firecrawl requires an API key (sign up at &lt;a href="https://www.firecrawl.dev/" rel="noopener noreferrer"&gt;firecrawl.dev&lt;/a&gt; for a free tier with 500 credits). Memberstack CLI uses OAuth browser login with no API key needed. Both tools store credentials locally so you authenticate once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which AI agents can run Firecrawl and Memberstack CLI together?
&lt;/h3&gt;

&lt;p&gt;Both tools ship &lt;a href="https://memberstack-cli.flashbrew.digital/docs/agent-skills" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; that work with Claude Code, OpenAI Codex, Gemini CLI, GitHub Copilot, Cursor, and any agent that supports the open skills standard. Install both skills and the agent can chain the two tools together in a single workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will this work with my live Memberstack environment?
&lt;/h3&gt;

&lt;p&gt;By default, Memberstack CLI runs all commands against your sandbox (test mode). This lets you test the full import without affecting live data. When you're happy with the results, add &lt;code&gt;--live&lt;/code&gt; to your commands to run against production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I update existing records instead of creating new ones?
&lt;/h3&gt;

&lt;p&gt;Yes. Use &lt;code&gt;memberstack records bulk-update --file updates.csv&lt;/code&gt; to update records you've already imported. The file needs an &lt;code&gt;id&lt;/code&gt; column with each record's ID. Add &lt;code&gt;--dry-run&lt;/code&gt; to preview what would change before committing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Firecrawl CLI scrapes the web and outputs clean markdown or JSON. Memberstack CLI imports that data into your membership platform. Together, they form a no-code pipeline from web to membership site.&lt;/li&gt;
&lt;li&gt;Install both with &lt;code&gt;npm install -g firecrawl-cli memberstack-cli&lt;/code&gt;. Authenticate each tool once.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;firecrawl scrape&lt;/code&gt; for single pages, &lt;code&gt;firecrawl crawl&lt;/code&gt; for site sections, or &lt;code&gt;firecrawl search --scrape&lt;/code&gt; to find and scrape in one step.&lt;/li&gt;
&lt;li&gt;Shape the scraped data into CSV or JSON, then import with &lt;code&gt;memberstack records import&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;AI agents like Claude Code can run this entire workflow from a plain-English prompt. Install both Agent Skills and let the agent handle it.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>nocode</category>
      <category>ai</category>
    </item>
    <item>
      <title>I built npx build-skill, here's why you should use it</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Mon, 16 Feb 2026 01:55:18 +0000</pubDate>
      <link>https://forem.com/bensabic/i-built-npx-build-skill-heres-why-you-should-use-it-2ag6</link>
      <guid>https://forem.com/bensabic/i-built-npx-build-skill-heres-why-you-should-use-it-2ag6</guid>
      <description>&lt;p&gt;Every time I wanted to create a new AI agent skills repository, I found myself doing the same tedious dance. Create the folder structure. Write the SKILL.md with the right frontmatter. Set up the marketplace config. Wire up GitHub Actions for validation. Write sync scripts. Copy-paste from old repos and hope I didn't miss a replacement.&lt;/p&gt;

&lt;p&gt;I got tired of it, so I built &lt;a href="https://github.com/Flash-Brew-Digital/build-skill" rel="noopener noreferrer"&gt;build-skill&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx build-skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command. Answer a few prompts. Get a complete, spec-compliant skills repository ready to publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is build-skill?
&lt;/h2&gt;

&lt;p&gt;build-skill is an open source CLI that scaffolds AI agent skill repositories following the &lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;Agent Skills Specification&lt;/a&gt;. It generates everything you need to start writing and distributing skills for AI coding agents like Claude Code, Cursor, Codex, and &lt;a href="https://skills.sh/" rel="noopener noreferrer"&gt;35+ others&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Think of it like &lt;code&gt;create-react-app&lt;/code&gt;, but for agent skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem it solves
&lt;/h2&gt;

&lt;p&gt;If you've tried creating a skills repository from scratch, you know the setup is tedious. A properly structured repo needs a specific folder layout with SKILL.md files containing correct YAML frontmatter, a &lt;code&gt;.claude-plugin/marketplace.json&lt;/code&gt; for the plugin marketplace, a &lt;code&gt;plugin.json&lt;/code&gt; inside each skill's directory, a GitHub Actions workflow for validation on PRs and syncing on push, and helper scripts to keep your README and configs in sync as you add or remove skills.&lt;/p&gt;

&lt;p&gt;None of it is hard. All of it is annoying. And if you get the structure wrong, your skills just silently don't work. No error, no feedback, just an agent that doesn't pick up what you built.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get when you run it
&lt;/h2&gt;

&lt;p&gt;When you run &lt;code&gt;npx build-skill&lt;/code&gt;, the CLI walks you through a few prompts (your brand name, skill name, and description) and generates this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your-brand-skills/
├── .claude-plugin/
│   └── marketplace.json
├── .github/
│   └── workflows/
│       └── process-skills.yml
├── scripts/
│   ├── add-skill.js
│   └── sync-skills.js
├── skills/
│   └── your-skill-name/
│       ├── .claude-plugin/
│       │   └── plugin.json
│       └── SKILL.md
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The GitHub Actions workflow validates all skills on pull requests using the &lt;a href="https://github.com/marketplace/actions/validate-skill" rel="noopener noreferrer"&gt;Validate Agent Skill&lt;/a&gt; action and syncs the README, marketplace.json, and plugin configs on push to main. That means your repo stays correct without manual maintenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Interactive mode
&lt;/h3&gt;

&lt;p&gt;The simplest way to get started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx build-skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll be prompted for your brand/organization name, skill name, and a description of what the skill does.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quiet mode for CI and scripting
&lt;/h3&gt;

&lt;p&gt;If you want to skip the prompts (useful for CI pipelines or scripting), pass everything as flags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx build-skill &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--brand&lt;/span&gt; acme-corp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; data-processor &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Processes CSV and JSON data files"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--quiet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adding more skills later
&lt;/h3&gt;

&lt;p&gt;The generated repo includes a helper script for adding new skills:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node scripts/add-skill.js my-new-skill &lt;span class="s2"&gt;"Description of what it does"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates the skill directory, generates the SKILL.md and plugin.json, and automatically runs the sync script to update your README and marketplace config.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use a template repo?
&lt;/h2&gt;

&lt;p&gt;I tried that first. But template repos have a few problems in this context. You still have to manually find-and-replace your brand name, skill name, and description across multiple files. The marketplace config and plugin.json need to reference the right paths. And every time the spec evolves, you're updating a template instead of bumping a version.&lt;/p&gt;

&lt;p&gt;With a CLI, the scaffolding adapts. You run the latest version and get the latest structure. No stale templates, no missed replacements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits in the ecosystem
&lt;/h2&gt;

&lt;p&gt;The Agent Skills ecosystem is growing fast. Vercel launched the &lt;a href="https://skills.sh/" rel="noopener noreferrer"&gt;skills CLI&lt;/a&gt; as a package manager for skills. Anthropic baked skills into Claude Code. The &lt;a href="https://agentskills.io" rel="noopener noreferrer"&gt;Agent Skills Specification&lt;/a&gt; is becoming a real standard across 35+ agents.&lt;/p&gt;

&lt;p&gt;build-skill sits at the beginning of that workflow. Before you can install, share, or discover skills, someone has to create them. And the less friction there is in getting from "I have an idea for a skill" to "I have a working repo ready to publish", the more skills get built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What agents does build-skill support?
&lt;/h3&gt;

&lt;p&gt;build-skill generates repositories that follow the open &lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;Agent Skills Specification&lt;/a&gt;. Any agent that supports this spec can use the skills you create. That currently includes Claude Code, Cursor, Codex, Windsurf, OpenCode, GitHub Copilot, and over 35 others.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to install build-skill globally?
&lt;/h3&gt;

&lt;p&gt;No. Running &lt;code&gt;npx build-skill&lt;/code&gt; fetches and runs the latest version without a global install. If you prefer a global install, you can run &lt;code&gt;npm install -g build-skill&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I add multiple skills to one repository?
&lt;/h3&gt;

&lt;p&gt;Yes. The generated repo is designed for multiple skills. Use the included &lt;code&gt;add-skill.js&lt;/code&gt; script to add new skills, and the &lt;code&gt;sync-skills.js&lt;/code&gt; script keeps your README and marketplace config up to date automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is build-skill tied to Claude Code specifically?
&lt;/h3&gt;

&lt;p&gt;No. While the generated repo includes &lt;code&gt;.claude-plugin&lt;/code&gt; configs for Claude Code's marketplace, the skills themselves follow the open Agent Skills Specification and work across any compatible agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  How is this different from &lt;code&gt;npx skills init&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;npx skills init&lt;/code&gt; creates a single SKILL.md file. build-skill scaffolds an entire repository with CI/CD workflows, marketplace configuration, sync scripts, and helper utilities for managing multiple skills over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx build-skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project is open source under MIT. The repo is at &lt;a href="https://github.com/Flash-Brew-Digital/build-skill" rel="noopener noreferrer"&gt;github.com/Flash-Brew-Digital/build-skill&lt;/a&gt; and the package is on &lt;a href="https://www.npmjs.com/package/build-skill" rel="noopener noreferrer"&gt;npm&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Issues, PRs, and feedback are all welcome. I'm curious what skills you're building for your agents.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>resources</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Stop Losing Marketing Attribution Data in Your Forms (Zero-Dependency Solution)</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Tue, 30 Dec 2025 11:05:03 +0000</pubDate>
      <link>https://forem.com/bensabic/stop-losing-marketing-attribution-data-in-your-forms-zero-dependency-solution-559</link>
      <guid>https://forem.com/bensabic/stop-losing-marketing-attribution-data-in-your-forms-zero-dependency-solution-559</guid>
      <description>&lt;p&gt;&lt;em&gt;Ever wondered where your leads actually come from? If you're not capturing UTM parameters and referrer data in your forms, you're flying blind.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Form Attribution&lt;/strong&gt; is a lightweight (~5KB), zero-dependency JavaScript library that automatically captures marketing attribution data (UTM parameters, referrer URLs, ad click IDs) and injects them as hidden fields into your forms. One script tag. No configuration required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/Flash-Brew-Digital/form-attribution" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt; | &lt;a href="https://form-attribution.flashbrew.digital/docs" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt; | &lt;a href="https://form-attribution.flashbrew.digital/builder" rel="noopener noreferrer"&gt;Interactive Builder&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Marketing Attribution Gap
&lt;/h2&gt;

&lt;p&gt;Here's a scenario every marketer and developer has faced: A lead submits a form on your website. Sales closes the deal. But when leadership asks "What campaign brought them in?" — silence.&lt;/p&gt;

&lt;p&gt;The attribution data was in the URL when the visitor landed. It was in the &lt;code&gt;document.referrer&lt;/code&gt;. But by the time they filled out the form three pages later, that data was gone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common workarounds that don't scale:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manually adding hidden fields to every form&lt;/li&gt;
&lt;li&gt;Building custom JavaScript for each project&lt;/li&gt;
&lt;li&gt;Relying on CRM-specific tracking scripts&lt;/li&gt;
&lt;li&gt;Asking users "How did you hear about us?" (unreliable)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Form Attribution?
&lt;/h2&gt;

&lt;p&gt;Form Attribution is an open-source JavaScript library that solves the attribution gap with minimal effort. It captures visitor data on first touch and persists it until form submission.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Does Form Attribution Work?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt;: On page load, captures URL parameters and metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persist&lt;/strong&gt;: Stores data in sessionStorage, localStorage, or cookies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inject&lt;/strong&gt;: Automatically adds hidden fields to all forms on the page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observe&lt;/strong&gt;: Uses MutationObserver to handle dynamically-added forms&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What Parameters Does Form Attribution Capture?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;URL Parameters (captured by default):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;utm_source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Traffic source (e.g., google, newsletter)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;utm_medium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Marketing medium (e.g., cpc, email)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;utm_campaign&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Campaign name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;utm_term&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Paid search keywords&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;utm_content&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Content variant for A/B testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;utm_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Campaign ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ref&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Referrer tracking parameter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Metadata (automatically captured):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;landing_page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;First page URL visited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;current_page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current page URL (form submission page)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;referrer_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Document referrer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;first_touch_timestamp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ISO 8601 timestamp of first visit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ad Platform Click IDs (optional):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gclid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Google Ads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fbclid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Meta Ads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msclkid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Microsoft Advertising&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ttclid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TikTok Ads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;li_fat_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LinkedIn Ads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;twclid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Twitter/X Ads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Quick Start: Basic Implementation
&lt;/h2&gt;

&lt;p&gt;Add this single line before your closing &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The script will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Capture UTM parameters and metadata from the current session&lt;/li&gt;
&lt;li&gt;Store them in sessionStorage (default)&lt;/li&gt;
&lt;li&gt;Inject hidden fields into every form on the page&lt;/li&gt;
&lt;li&gt;Monitor for dynamically-added forms via MutationObserver&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What Gets Injected Into Forms?
&lt;/h3&gt;

&lt;p&gt;Each captured parameter becomes a hidden input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; 
  &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"utm_source"&lt;/span&gt; 
  &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"google"&lt;/span&gt; 
  &lt;span class="na"&gt;data-form-attribution=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
  &lt;span class="na"&gt;data-form-attribution-managed=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key behaviors:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existing hidden fields with matching names are updated (no duplicates)&lt;/li&gt;
&lt;li&gt;User-visible form fields are never modified&lt;/li&gt;
&lt;li&gt;All values are HTML-entity encoded for XSS protection&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Configuration Options
&lt;/h2&gt;

&lt;p&gt;For more control, use data attributes on the script tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-storage=&lt;/span&gt;&lt;span class="s"&gt;"localStorage"&lt;/span&gt;
  &lt;span class="na"&gt;data-field-prefix=&lt;/span&gt;&lt;span class="s"&gt;"attr_"&lt;/span&gt;
  &lt;span class="na"&gt;data-extra-params=&lt;/span&gt;&lt;span class="s"&gt;"custom_param,another_param"&lt;/span&gt;
  &lt;span class="na"&gt;data-exclude-forms=&lt;/span&gt;&lt;span class="s"&gt;".no-track, [data-no-attribution]"&lt;/span&gt;
  &lt;span class="na"&gt;data-click-ids=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
  &lt;span class="na"&gt;data-debug=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Available Configuration Options
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-storage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sessionStorage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Storage method: &lt;code&gt;sessionStorage&lt;/code&gt;, &lt;code&gt;localStorage&lt;/code&gt;, or &lt;code&gt;cookie&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-field-prefix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prefix for hidden field names (e.g., &lt;code&gt;attr_&lt;/code&gt; → &lt;code&gt;attr_utm_source&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-extra-params&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Comma-separated additional URL parameters to capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-exclude-forms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CSS selector for forms to exclude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-storage-key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;form_attribution_data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Custom storage key name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-debug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable console logging and debug panel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-privacy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;"false"&lt;/code&gt; to disable GPC/DNT detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-click-ids&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;"true"&lt;/code&gt; to capture ad platform click IDs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Storage Options Explained
&lt;/h2&gt;

&lt;h3&gt;
  
  
  When to Use sessionStorage (Default)
&lt;/h3&gt;

&lt;p&gt;Best for single-session attribution where you want data cleared when the browser closes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-storage=&lt;/span&gt;&lt;span class="s"&gt;"sessionStorage"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Use localStorage
&lt;/h3&gt;

&lt;p&gt;Best for first-touch attribution across multiple sessions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-storage=&lt;/span&gt;&lt;span class="s"&gt;"localStorage"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Use Cookies
&lt;/h3&gt;

&lt;p&gt;Best for cross-subdomain tracking or server-side access.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-storage=&lt;/span&gt;&lt;span class="s"&gt;"cookie"&lt;/span&gt;
  &lt;span class="na"&gt;data-cookie-domain=&lt;/span&gt;&lt;span class="s"&gt;".example.com"&lt;/span&gt;
  &lt;span class="na"&gt;data-cookie-expires=&lt;/span&gt;&lt;span class="s"&gt;"90"&lt;/span&gt;
  &lt;span class="na"&gt;data-cookie-samesite=&lt;/span&gt;&lt;span class="s"&gt;"lax"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cookie-specific options:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-cookie-domain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cookie domain (e.g., &lt;code&gt;.example.com&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-cookie-path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cookie path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-cookie-expires&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expiration in days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-cookie-samesite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lax&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SameSite policy: &lt;code&gt;lax&lt;/code&gt;, &lt;code&gt;strict&lt;/code&gt;, or &lt;code&gt;none&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Storage Fallback Chain
&lt;/h3&gt;

&lt;p&gt;If your preferred storage isn't available, the script falls back gracefully:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requested&lt;/th&gt;
&lt;th&gt;Fallback Chain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;localStorage → sessionStorage → cookie → memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sessionStorage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sessionStorage → cookie → memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;cookie → memory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  JavaScript API for Custom Integrations
&lt;/h2&gt;

&lt;p&gt;Form Attribution exposes a global &lt;code&gt;FormAttribution&lt;/code&gt; object:&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="c1"&gt;// Get all attribution data&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;FormAttribution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// → { utm_source: 'google', utm_medium: 'cpc', ... }&lt;/span&gt;

&lt;span class="c1"&gt;// Get a specific parameter&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;FormAttribution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getParam&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_source&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// → 'google'&lt;/span&gt;

&lt;span class="c1"&gt;// Get all tracked forms with status&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;forms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;FormAttribution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getForms&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Clear stored data&lt;/span&gt;
&lt;span class="nx"&gt;FormAttribution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Re-inject data into forms&lt;/span&gt;
&lt;span class="nx"&gt;FormAttribution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;refresh&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Event Callbacks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Fires when initialization is complete&lt;/span&gt;
&lt;span class="nx"&gt;FormAttribution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;onReady&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&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;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;Attribution ready:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Fires when new data is captured&lt;/span&gt;
&lt;span class="nx"&gt;FormAttribution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;onCapture&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;data&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;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;New data captured:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Fires when data is updated&lt;/span&gt;
&lt;span class="nx"&gt;FormAttribution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;onUpdate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;data&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;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;Data updated:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Remove a callback&lt;/span&gt;
&lt;span class="nx"&gt;FormAttribution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;off&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;onCapture&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;myHandler&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Privacy-First Design
&lt;/h2&gt;

&lt;p&gt;By default, Form Attribution respects user privacy preferences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global Privacy Control (GPC)&lt;/strong&gt;: Tracking disabled when &lt;code&gt;navigator.globalPrivacyControl&lt;/code&gt; is true&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do Not Track (DNT)&lt;/strong&gt;: Tracking disabled when DNT is enabled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When privacy signals are detected, &lt;strong&gt;no data is captured or stored&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Override privacy detection (not recommended) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-privacy=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Debug Panel for Development
&lt;/h2&gt;

&lt;p&gt;Enable the visual debug panel during development:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-debug=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Debug panel features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Tab&lt;/strong&gt;: View all captured UTM parameters and metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forms Tab&lt;/strong&gt;: See all forms and their injection status (click to highlight)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log Tab&lt;/strong&gt;: Real-time activity log with timestamps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actions&lt;/strong&gt;: Copy data as JSON, clear storage, refresh forms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The panel is draggable, collapsible, and uses Shadow DOM for style isolation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Remove &lt;code&gt;data-debug&lt;/code&gt; before deploying to production.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use Case 1: HubSpot Form Integration
&lt;/h3&gt;

&lt;p&gt;Capture UTM parameters and pass them to HubSpot for closed-loop reporting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-field-prefix=&lt;/span&gt;&lt;span class="s"&gt;"hs_"&lt;/span&gt;
  &lt;span class="na"&gt;data-storage=&lt;/span&gt;&lt;span class="s"&gt;"localStorage"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Case 2: Multi-Domain Tracking
&lt;/h3&gt;

&lt;p&gt;Track attribution across subdomains (blog.example.com → app.example.com):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-storage=&lt;/span&gt;&lt;span class="s"&gt;"cookie"&lt;/span&gt;
  &lt;span class="na"&gt;data-cookie-domain=&lt;/span&gt;&lt;span class="s"&gt;".example.com"&lt;/span&gt;
  &lt;span class="na"&gt;data-cookie-expires=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Case 3: Paid Ad Campaign Tracking
&lt;/h3&gt;

&lt;p&gt;Capture all major ad platform click IDs for offline conversion tracking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-click-ids=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
  &lt;span class="na"&gt;data-storage=&lt;/span&gt;&lt;span class="s"&gt;"localStorage"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Case 4: Exclude Login/Auth Forms
&lt;/h3&gt;

&lt;p&gt;Prevent attribution injection on sensitive forms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;
  &lt;span class="na"&gt;data-exclude-forms=&lt;/span&gt;&lt;span class="s"&gt;".login-form, .auth-form, [data-no-track]"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"login-form"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- No attribution fields injected here --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why Not Just Use Google Analytics?
&lt;/h2&gt;

&lt;p&gt;Great question. Google Analytics is excellent for aggregate traffic analysis. But it doesn't help when you need &lt;strong&gt;lead-level attribution&lt;/strong&gt; in your CRM, email platform, or database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Form Attribution complements GA by:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passing attribution data directly into form submissions&lt;/li&gt;
&lt;li&gt;Enabling CRM-native attribution reporting&lt;/li&gt;
&lt;li&gt;Supporting offline conversion tracking&lt;/li&gt;
&lt;li&gt;Working without cookies (sessionStorage/localStorage options)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Form Attribution work with React/Vue/Angular?
&lt;/h3&gt;

&lt;p&gt;Yes. The MutationObserver monitors the entire DOM for form elements, including those rendered by JavaScript frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does it work with iframes?
&lt;/h3&gt;

&lt;p&gt;The script only operates on forms within its own document context. For cross-origin iframes, you'll need to include the script in each iframe.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about GDPR/CCPA compliance?
&lt;/h3&gt;

&lt;p&gt;Form Attribution respects GPC and DNT by default. For full compliance, ensure your privacy policy discloses the use of attribution tracking and provide users a mechanism to opt-out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use it with Webflow/WordPress/Squarespace?
&lt;/h3&gt;

&lt;p&gt;Yes. Add the script via your platform's custom code injection feature (usually in site-wide footer scripts).&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance &amp;amp; Bundle Size
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero dependencies&lt;/strong&gt;: No jQuery, no React, no external libraries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~5KB minified&lt;/strong&gt;: Minimal impact on page load&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy initialization&lt;/strong&gt;: Runs after DOMContentLoaded&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficient DOM updates&lt;/strong&gt;: Uses MutationObserver, not polling&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Add a single script tag before your closing &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it — no build step, no package manager, no configuration required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Interactive Script Builder
&lt;/h2&gt;

&lt;p&gt;Not sure which options you need? Use the &lt;a href="https://form-attribution.flashbrew.digital/builder" rel="noopener noreferrer"&gt;Interactive Script Builder&lt;/a&gt; to generate a configured script tag with a visual interface.&lt;/p&gt;




&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;Form Attribution is open source under the Apache-2.0 license. Contributions welcome!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Flash-Brew-Digital/form-attribution" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://form-attribution.flashbrew.digital/docs" rel="noopener noreferrer"&gt;Full Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Flash-Brew-Digital/form-attribution/issues" rel="noopener noreferrer"&gt;Report Issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Marketing attribution shouldn't require complex integrations or heavyweight tracking platforms. Form Attribution provides a simple, privacy-respecting solution that works out of the box with any form on any website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One script tag. Zero configuration. Complete attribution data.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://bensabic.ca" rel="noopener noreferrer"&gt;Ben Sabic&lt;/a&gt; at &lt;a href="https://flashbrew.digital" rel="noopener noreferrer"&gt;Flash Brew Digital&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>marketing</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Scaling Webflow Sites Past 100 Pages: The Reverse Proxy Solution</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Fri, 29 Aug 2025 04:05:43 +0000</pubDate>
      <link>https://forem.com/224industries/scaling-webflow-sites-past-100-pages-the-reverse-proxy-solution-2ohj</link>
      <guid>https://forem.com/224industries/scaling-webflow-sites-past-100-pages-the-reverse-proxy-solution-2ohj</guid>
      <description>&lt;h2&gt;
  
  
  How enterprise companies like Upwork leverage reverse proxy to run high-performance sites on Webflow while maintaining SEO authority and adding server-side capabilities
&lt;/h2&gt;

&lt;p&gt;Webflow's 100-page static limit and single-folder URL structure can create significant roadblocks for growing businesses. But what if you could maintain Webflow's visual development power while removing virtually all platform limitations? This comprehensive guide from 224 Industries reveals how reverse proxy technology transforms what's possible with Webflow.&lt;/p&gt;

&lt;p&gt;A reverse proxy acts as an intelligent traffic controller, routing visitors to different content sources while maintaining a consistent domain experience. Major brands like Upwork run their blog on Webflow while their main application uses Vue.js—all seamlessly under one domain. Even Webflow itself uses this approach for their templates store and blog.&lt;/p&gt;

&lt;p&gt;Key capabilities unlocked include connecting multiple Webflow projects to build 500+ page sites, implementing server-side authentication for truly secure gated content, capturing analytics that bypass ad-blockers, and maintaining complex URL structures like /resources/whitepapers/2025/ai-trends that Webflow can't natively support.&lt;/p&gt;

&lt;p&gt;The business impact is substantial: consolidating subdomains under one domain concentrates SEO authority instead of diluting it across blog.site.com and docs.site.com. It enables gradual platform migrations with zero downtime, preserves all existing URLs and link equity, and allows different teams to use their preferred tools while maintaining a unified web presence.&lt;/p&gt;

&lt;p&gt;Implementation complexity varies—basic Cloudflare Worker setups take hours with intermediate technical skills, while authentication or e-commerce integrations require developer expertise. The article provides detailed scenarios, real-world examples, and a clear framework for determining if reverse proxy suits your needs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://224industries.com.au/blog/webflow-reverse-proxy" rel="noopener noreferrer"&gt;Learn more about reverse proxies in Webflow →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>webflow</category>
    </item>
    <item>
      <title>How AI Agents Are Revolutionizing Webflow Development in 2025</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Thu, 28 Aug 2025 02:40:33 +0000</pubDate>
      <link>https://forem.com/224industries/how-ai-agents-are-revolutionizing-webflow-development-in-2025-kp8</link>
      <guid>https://forem.com/224industries/how-ai-agents-are-revolutionizing-webflow-development-in-2025-kp8</guid>
      <description>&lt;h2&gt;
  
  
  Cut development time by 40-60% with native AI tools and workflow automation that transform routine tasks into intelligent, self-managing processes
&lt;/h2&gt;

&lt;p&gt;The integration of AI with Webflow is fundamentally changing how developers and designers approach web development in 2025. This article explores how agencies can leverage AI automation to deliver faster turnarounds while maintaining quality, transforming traditional development workflows into intelligent, self-managing systems.&lt;/p&gt;

&lt;p&gt;Webflow's native AI Assistant now generates new page sections using existing design systems, while third-party tools like Miyagi bring unprecedented automation capabilities. Miyagi's specialized agents—Design, Code, and CMS—work directly within projects to clean styles, fix accessibility issues, write JavaScript/CSS, and automate content operations. Users report saving hours on tasks that previously took days.&lt;/p&gt;

&lt;p&gt;The ecosystem extends beyond Miyagi. Tools like n8n enable complex workflow automation connecting Webflow with AI models from OpenAI to Anthropic's Claude. Asset Bae automates image optimization and alt text generation, while Jasper handles on-brand content creation at scale.&lt;/p&gt;

&lt;p&gt;For marketing teams, the practical applications are immediately valuable: automated CMS updates, SEO optimization, workflow automation connecting CRMs and analytics platforms, and AI-powered localization for global reach. The article provides crucial ROI insights—67% of business leaders expect AI to reshape their organizations within two years, yet only 31% can evaluate ROI within six months.&lt;/p&gt;

&lt;p&gt;Interestingly, productivity has overtaken profitability as the primary ROI metric in 2025. The guide recommends tracking development time reduction (target: 40-60% for routine tasks), content generation speed, and project turnaround times. Implementation advice emphasizes starting small, choosing native solutions, and scaling gradually.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://224industries.com.au/blog/webflow-ai-automation" rel="noopener noreferrer"&gt;Discover the complete AI automation guide for Webflow →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>webflow</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Webflow Developer's AI Toolkit: Five Apps That Save Hours Daily</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Thu, 28 Aug 2025 02:38:38 +0000</pubDate>
      <link>https://forem.com/224industries/the-webflow-developers-ai-toolkit-five-apps-that-save-hours-daily-1mld</link>
      <guid>https://forem.com/224industries/the-webflow-developers-ai-toolkit-five-apps-that-save-hours-daily-1mld</guid>
      <description>&lt;h2&gt;
  
  
  From Miyagi's native design agents to Slater's unlimited code editor—practical tools that actually ship in production environments
&lt;/h2&gt;

&lt;p&gt;For Webflow developers looking to dramatically accelerate their workflow, these five AI-powered apps represent the cutting edge of development automation in 2025. Each tool addresses specific pain points that traditionally consume hours of manual work.&lt;/p&gt;

&lt;p&gt;Miyagi leads the pack as a native Webflow app with three specialized agents. Unlike ChatGPT or browser extensions, it executes changes directly in your project—cleaning styles, fixing accessibility, standardizing SEO, writing context-aware code, and handling CMS migrations. It understands your project's structure, making it invaluable for complex sites.&lt;/p&gt;

&lt;p&gt;Slater solves Webflow's custom code limitations with unlimited character capacity, AI code generation, and staging/production publishing. Perfect for GSAP animations and advanced functionality, it includes code explanations to help developers learn while building.&lt;/p&gt;

&lt;p&gt;Asset Bae automates the tedious task of image optimization—generating SEO-friendly alt text, renaming files properly, and ensuring WCAG compliance across entire collections. For content-heavy sites, it's a game-changer.&lt;/p&gt;

&lt;p&gt;Webflow AI Assistant brings native design generation that respects your existing design system. It creates new sections from conversational prompts, suggests conversion optimizations, and delivers contextual help without leaving the canvas.&lt;/p&gt;

&lt;p&gt;Jasper rounds out the toolkit with enterprise-grade content generation. Its Webflow integration maintains brand voice consistency while rapidly producing product descriptions, blog posts, and multi-language content.&lt;/p&gt;

&lt;p&gt;The implementation strategy is straightforward: start with Miyagi for immediate productivity gains, add Slater for custom functionality, implement Asset Bae before major content uploads, leverage AI Assistant for prototyping, and integrate Jasper when content becomes a bottleneck.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://224industries.com.au/blog/five-webflow-ai-apps" rel="noopener noreferrer"&gt;Explore all five AI apps and transform your Webflow workflow →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>webflow</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building a Tech Startup Brand That Converts</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Thu, 28 Aug 2025 02:35:31 +0000</pubDate>
      <link>https://forem.com/224industries/building-a-tech-startup-brand-that-converts-251o</link>
      <guid>https://forem.com/224industries/building-a-tech-startup-brand-that-converts-251o</guid>
      <description>&lt;h2&gt;
  
  
  From mission statements to market positioning—a data-driven approach to creating brands that resonate with 88% of values-conscious consumers
&lt;/h2&gt;

&lt;p&gt;Building a startup brand goes far beyond logos and color palettes—it's about creating a strategic foundation that drives growth and resonates with your target market. This comprehensive guide from 224 Industries breaks down the essential components of effective brand building for Australian startups.&lt;/p&gt;

&lt;p&gt;The article emphasizes starting with core fundamentals: defining your mission (why you exist beyond profit) and vision (the future you're creating). It then dives into uncovering your unique market position—that crucial gap only your startup can fill. With 88% of consumers globally feeling brand messages don't align with their values, and 46% of Australian shoppers prioritizing sustainability, purpose-driven branding isn't just nice-to-have—it's a competitive advantage.&lt;/p&gt;

&lt;p&gt;Key practical takeaways include a detailed brand foundation checklist covering mission statements, target audience definition, and unique value propositions. The guide explores building visual identity systems that work cohesively, from typography to imagery styles, all documented in a comprehensive brand style guide.&lt;/p&gt;

&lt;p&gt;The article also covers crafting messaging pillars, developing content strategies, and executing successful brand launches. It addresses common founder concerns like budgeting (expect $15,000-$50,000 for comprehensive projects), timing for rebrands, and measuring ROI through metrics like branded search volume and customer acquisition costs.&lt;/p&gt;

&lt;p&gt;Real-world examples, including Canva's democratization of design and their journey to 220 million users, illustrate how strategic positioning drives success. The guide concludes with actionable frameworks for social media community building and amplification strategies specific to the Australian market.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://224industries.com.au/blog/startup-branding-strategy" rel="noopener noreferrer"&gt;Read the full startup branding strategy guide →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>saas</category>
    </item>
    <item>
      <title>GPT-5 vs GPT-4: Why You Should Upgrade</title>
      <dc:creator>Ben Sabic</dc:creator>
      <pubDate>Fri, 08 Aug 2025 04:19:11 +0000</pubDate>
      <link>https://forem.com/bensabic/gpt-5-vs-gpt-4-why-you-should-upgrade-3jgn</link>
      <guid>https://forem.com/bensabic/gpt-5-vs-gpt-4-why-you-should-upgrade-3jgn</guid>
      <description>&lt;h2&gt;
  
  
  GPT-5 is here
&lt;/h2&gt;

&lt;p&gt;OpenAI's GPT-5, released yesterday on August 7, 2025, makes staying on GPT-4 increasingly difficult to justify. With &lt;strong&gt;2x better context length&lt;/strong&gt;, &lt;strong&gt;50% lower input costs&lt;/strong&gt;, and &lt;strong&gt;45-80% fewer hallucinations&lt;/strong&gt;, the new model addresses every major pain point of its predecessor. Even OpenAI's CEO Sam Altman acknowledged GPT-4's shortcomings, calling it &lt;strong&gt;"mildly embarrassing at best"&lt;/strong&gt; and admitting the model &lt;strong&gt;"kind of sucks"&lt;/strong&gt; compared to what GPT-5 now delivers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Superior performance eliminates GPT-4's frustrations
&lt;/h2&gt;

&lt;p&gt;GPT-5 doesn't just incrementally improve on GPT-4—it fundamentally solves its most aggravating limitations. The model achieves &lt;strong&gt;74.9% on SWE-bench Verified&lt;/strong&gt; for coding tasks, leaving GPT-4's 69.1% in the dust. Mathematical reasoning jumps to &lt;strong&gt;94.6% accuracy on AIME 2025&lt;/strong&gt;, with perfect scores when using Python assistance. Most critically, hallucination rates plummet by up to 80% with the integrated reasoning system, finally delivering the reliability that GPT-4 users have been desperately seeking.&lt;/p&gt;

&lt;p&gt;The unified architecture represents a paradigm shift in usability. While GPT-4 forces you to juggle between GPT-4o for general tasks and separate o-series models for complex reasoning, GPT-5 &lt;strong&gt;automatically routes queries&lt;/strong&gt; to optimal processing modes. This eliminates the guesswork and context-switching that makes GPT-4 workflows unnecessarily complex.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lower costs make GPT-4 economically obsolete
&lt;/h2&gt;

&lt;p&gt;Here's the killer advantage: GPT-5 outperforms GPT-4 while costing &lt;strong&gt;half as much&lt;/strong&gt;. At $1.25 per million input tokens versus GPT-4o's $2.50, you're literally paying more for inferior results by sticking with the older model. GPT-5 Mini pushes this even further at &lt;strong&gt;$0.25 per million input tokens&lt;/strong&gt;, opening up use cases that were economically impossible with GPT-4's pricing structure.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;272,000 token context window&lt;/strong&gt; dwarfs GPT-4o's 128,000 token limit, meaning fewer API calls, simpler implementations, and the ability to process entire codebases or lengthy documents in single requests. Every metric that matters—performance, cost, capability—favors immediate migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revolutionary features leave GPT-4 behind
&lt;/h2&gt;

&lt;p&gt;GPT-5's "vibe coding" capability generates &lt;strong&gt;complete, production-ready applications&lt;/strong&gt; from casual descriptions, accomplishing in minutes what takes hours of careful prompt engineering with GPT-4. The model intuitively grasps design patterns, architectural decisions, and aesthetic preferences that GPT-4 consistently misunderstands or ignores.&lt;/p&gt;

&lt;p&gt;Healthcare professionals see a &lt;strong&gt;46.2% score on HealthBench Hard&lt;/strong&gt;, while improved safety mechanisms replace GPT-4's frustrating blanket refusals with nuanced, contextual responses. The dramatic reduction in sycophantic behavior means you finally get honest, reliable outputs instead of GPT-4's tendency to agree with incorrect premises.&lt;/p&gt;

&lt;h2&gt;
  
  
  The few edge cases for keeping GPT-4
&lt;/h2&gt;

&lt;p&gt;Only three scenarios justify maintaining GPT-4 access: legacy systems with hard-coded dependencies that can't be immediately updated, regulated environments requiring specific model certifications that haven't yet approved GPT-5, and ultra-low-latency applications where GPT-4.1 Nano's marginal speed advantage outweighs accuracy improvements. Audio processing currently remains exclusive to GPT-4o, though GPT-5's multimodal expansion roadmap will eliminate this gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line: Upgrade immediately
&lt;/h2&gt;

&lt;p&gt;Continuing to use GPT-4 means accepting inferior results at higher prices—a position that becomes increasingly indefensible as competitors adopt GPT-5's capabilities. With immediate availability across all subscription tiers and API access, there's no technical barrier to migration. Organizations clinging to GPT-4 risk not just competitive disadvantage but active user frustration as GPT-5's superior performance becomes the expected baseline.&lt;/p&gt;

&lt;p&gt;The upgrade path is clear: better results, lower costs, simpler implementation. GPT-5 doesn't just improve on GPT-4—it makes it obsolete.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>productivity</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
