<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Damilare Abogunrin</title>
    <description>The latest articles on DEV Community by Damilare Abogunrin (@damilare_abogunrin).</description>
    <link>https://dev.to/damilare_abogunrin</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%2F769688%2F9f75c94d-467a-4c5e-8803-bad373f91cac.jpg</url>
      <title>DEV Community: Damilare Abogunrin</title>
      <link>https://dev.to/damilare_abogunrin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/damilare_abogunrin"/>
    <language>en</language>
    <item>
      <title>Automating Image Processing with Zapier, Google Drive, Canva, and Notion</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Sat, 15 Mar 2025 10:23:52 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/automating-image-processing-with-zapier-google-drive-canva-and-notion-2jef</link>
      <guid>https://dev.to/damilare_abogunrin/automating-image-processing-with-zapier-google-drive-canva-and-notion-2jef</guid>
      <description>&lt;p&gt;This project was developed for an Upwork job requiring the automation of image processing workflows. The client needed to integrate Google Drive, Canva, and Notion using Zapier to streamline file organization, background removal assignments, and task tracking while maintaining necessary human oversight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools Needed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zapier (For automation workflows)&lt;/li&gt;
&lt;li&gt;Google Drive (For storing and sorting images)&lt;/li&gt;
&lt;li&gt;Canva (For background removal)&lt;/li&gt;
&lt;li&gt;Notion (For tracking tasks and managing workflow)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Guide to Setting Up the Automation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Automate File Organization &amp;amp; Sorting with Zapier Paths
&lt;/h3&gt;

&lt;p&gt;Instead of using Zapier Filters, we opted for Zapier Paths to dynamically sort files into multiple folders based on their names. We started by creating a "New Images" folder in Google Drive, where all raw images would be uploaded for processing. &lt;/p&gt;

&lt;p&gt;A Zap was then set up to detect new file uploads, using Google Drive’s "New File in Folder" trigger, ensuring any newly added images were recognized. To automate sorting, Zapier Paths were implemented—Path A moved files containing "Etsy" in their names to an "Etsy Orders" folder, while Path B assigned other images to relevant categories based on predefined conditions.&lt;/p&gt;

&lt;p&gt;With this setup, every uploaded image is automatically renamed and sorted into the correct Google Drive folder without manual intervention. This streamlined workflow ensures efficient organization, reducing the need for manual sorting and improving overall productivity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ybgba12649hueetwcp5.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%2F6ybgba12649hueetwcp5.png" alt="Image description" width="480" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Automate Image Routing to Canva for Background Removal
&lt;/h3&gt;

&lt;p&gt;Since Canva lacks a direct Zapier integration, we implemented a workaround using Google Drive and team notifications.&lt;/p&gt;

&lt;p&gt;Images requiring background removal are first uploaded to a designated "Background Removal" folder in Google Drive, triggering Zapier to detect new files. A notification is then sent via Slack, Email, or Notion, alerting the team with a message that includes a Google Drive link to the image, ensuring prompt action.&lt;/p&gt;

&lt;p&gt;Once the background is removed in Canva, the processed image is manually uploaded to the "Processed Images" folder in Google Drive. Zapier detects this new file and moves it to the next workflow stage. This setup streamlines collaboration, instantly notifying the team and efficiently transferring processed images for further use.&lt;/p&gt;

&lt;p&gt;✅ Automated Outcome: The team is notified instantly, and processed images are seamlessly transferred for further use.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Automate Task Assignments &amp;amp; Notifications
&lt;/h3&gt;

&lt;p&gt;Once an image is processed, the next step is to notify the team and update the Notion task tracker. Zapier detects new files in the "Processed Images" folder in Google Drive, triggering the creation of a new task in Notion. The task includes essential details such as the image title, Google Drive link, assigned team member, due date, and status (Pending/Completed), ensuring everything is well-organized.&lt;/p&gt;

&lt;p&gt;To keep the workflow efficient, the assigned team member is instantly notified via Slack or Email with a message that includes a direct Notion link to the task. This setup ensures smooth task management, keeping everyone informed and streamlining the image processing workflow.&lt;/p&gt;

&lt;p&gt;✅ Automated Outcome: Tasks are auto-created, and team members receive instant notifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Workflow Summary
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;File Sorting → Google Drive (via Zapier Paths)&lt;/li&gt;
&lt;li&gt;Image Processing → Canva (via Manual Step)&lt;/li&gt;
&lt;li&gt;Task Assignments → Notion (via Zapier)&lt;/li&gt;
&lt;li&gt;Order Tracking → Notion (Auto-Updates &amp;amp; Notifications)&lt;/li&gt;
&lt;li&gt;Error Handling → Automatic Reminders for Delayed Tasks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This scalable automation system minimizes manual effort while ensuring smooth workflow execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  📌 Upwork Job Description
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Zapier Automation Expert Needed for Image Processing &amp;amp; Workflow Optimization&lt;br&gt;
Budget: $150 | Experience Level: Intermediate | Job Type: Fixed-price&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Scope of Work
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Automate File Sorting (Google Drive + Zapier Paths)&lt;/li&gt;
&lt;li&gt;Automate Image Routing to Canva&lt;/li&gt;
&lt;li&gt;Automate Task Assignments &amp;amp; Notifications (Notion + Slack)&lt;/li&gt;
&lt;li&gt;Automate Order Management Tracking&lt;/li&gt;
&lt;li&gt;Workflow Oversight &amp;amp; Error Handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Required Skills: Zapier, Google Drive, Canva, Notion, Slack.&lt;/p&gt;

&lt;p&gt;Timeline: 1-2 weeks | Budget: $150-$200&lt;/p&gt;

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

&lt;p&gt;This Upwork project successfully automated image processing using Zapier, Google Drive, Canva, and Notion, reducing manual work while keeping necessary humans in the loop. By implementing Zapier Paths, notifications, and Notion-based tracking, the workflow is now more efficient.&lt;/p&gt;

&lt;p&gt;💡 Have a similar automation project? Reach out in the comments section and let me implement your workflow!&lt;/p&gt;

</description>
      <category>zapier</category>
      <category>automation</category>
    </item>
    <item>
      <title>Case Study: How Automation Saved Membership Management at IronCore Fitness</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Sun, 05 Jan 2025 06:44:15 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/case-study-how-automation-saved-membership-management-at-ironcore-fitness-3kb3</link>
      <guid>https://dev.to/damilare_abogunrin/case-study-how-automation-saved-membership-management-at-ironcore-fitness-3kb3</guid>
      <description>&lt;h2&gt;
  
  
  A Membership Management Nightmare
&lt;/h2&gt;

&lt;p&gt;Sarah, the owner of IronCore Fitness, sat at her desk one evening, staring at the piles of paperwork on her desk. It was the end of the month, and she dreaded this part of running the business—tracking overdue memberships, processing payments, and trying to win back lapsed members.&lt;/p&gt;

&lt;p&gt;“I didn’t start this business to become a full-time administrator,” Sarah thought, overwhelmed.&lt;/p&gt;

&lt;p&gt;Her staff was equally frustrated. Jane, her front desk manager, had spent hours that day calling members about overdue payments and sending manual reminders. Despite their best efforts, some members complained about being charged incorrectly, while others left due to lack of communication. IronCore was losing money, and Sarah felt the weight of it all.&lt;/p&gt;

&lt;p&gt;“This is unsustainable,” Sarah admitted during a team meeting. “We need a better way to manage memberships, or we won’t survive.”&lt;/p&gt;

&lt;h2&gt;
  
  
  A Ray of Hope
&lt;/h2&gt;

&lt;p&gt;One evening, while scrolling through her emails, Sarah stumbled upon a success story about another fitness studio that had transformed its operations with automation. Intrigued, she reached out to us to explore how automation could help IronCore Fitness.&lt;/p&gt;

&lt;p&gt;“I need something that works,” Sarah said during our first call. “It has to be simple, reliable, and something my team can easily use.”&lt;/p&gt;

&lt;p&gt;We assured her, “You’re not alone in this struggle. Let’s build a system that will take care of the repetitive tasks so you can focus on growing your studio.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The Transformation: Automated Membership Management
&lt;/h2&gt;

&lt;p&gt;After understanding IronCore’s specific challenges, we designed a custom no-code automation workflow to handle their membership management seamlessly.&lt;/p&gt;

&lt;p&gt;Here’s what we implemented:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Automated Renewal Reminders:&lt;br&gt;
Members received email and SMS reminders 7 days and 1 day before their memberships expired, with a direct link to renew.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Error-Free Billing:&lt;br&gt;
Integrated payment processing ensured invoices were accurate and receipts were sent automatically. Failed payments triggered immediate notifications to members with retry options.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Centralized Member Database:&lt;br&gt;
Airtable became their central hub for member data. It visually tracked member status—active, pending renewal, or lapsed—so the team always had up-to-date information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Member Retention Campaigns:&lt;br&gt;
Lapsed members were automatically added to reactivation campaigns, offering incentives like discounts or free classes to bring them back.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Staff Time Optimization:&lt;br&gt;
Automated processes freed up Jane and the rest of the team to focus on engaging with members and improving the gym experience.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A New Beginning for IronCore Fitness
&lt;/h2&gt;

&lt;p&gt;A month after the system went live, the change was remarkable.&lt;/p&gt;

&lt;p&gt;Sarah noticed it first during her morning coffee. Instead of fielding complaints or dealing with overdue payments, she could review clear, actionable reports from Airtable. “I actually feel in control for the first time in years,” she thought with relief.&lt;/p&gt;

&lt;p&gt;Jane, too, was thrilled. “I no longer spend my days chasing payments or typing reminder emails,” she said. “I can finally focus on welcoming members and helping them feel at home.”&lt;/p&gt;

&lt;p&gt;Most importantly, the members loved it. They appreciated the timely reminders and seamless payment process. “It’s so easy now,” one member shared. “I renewed my membership in two clicks!”&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Revenue Growth:&lt;br&gt;
IronCore reduced revenue leakage by 95%, recovering over $10,000 annually from missed renewals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Time Savings:&lt;br&gt;
The team saved 20 hours per week, equivalent to $12,000 annually in labor costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved Member Retention:&lt;br&gt;
Timely communication and reactivation campaigns increased member retention by 30%.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced Member Satisfaction:&lt;br&gt;
Positive feedback emphasized the convenience and reliability of the new system.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sarah’s Perspective
&lt;/h2&gt;

&lt;p&gt;“This system didn’t just save us time and money—it saved my sanity. I can finally focus on growing my business instead of drowning in admin work. Our members love the smooth process, and I feel confident about our future.”&lt;/p&gt;

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

&lt;p&gt;Sarah’s story shows how automation can revolutionize fitness business operations. By replacing manual processes with a tailored no-code workflow, IronCore Fitness turned its membership management nightmare into a well-oiled machine, saving money and building stronger relationships with members.&lt;/p&gt;

&lt;h2&gt;
  
  
  Book a Consultation Today
&lt;/h2&gt;

&lt;p&gt;If you’re ready to simplify your operations and take your fitness studio to the next level, let’s talk. Schedule a free consultation today to see how automation can work for you.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Case Study: How Automation Revolutionized Class Scheduling for a Fitness Studio</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Sun, 05 Jan 2025 06:40:06 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/case-study-how-automation-revolutionized-class-scheduling-for-a-fitness-studio-ag8</link>
      <guid>https://dev.to/damilare_abogunrin/case-study-how-automation-revolutionized-class-scheduling-for-a-fitness-studio-ag8</guid>
      <description>&lt;h2&gt;
  
  
  A Chaotic Start
&lt;/h2&gt;

&lt;p&gt;It was 6:00 AM on a Monday morning, and Alex, the owner of Thrive Fitness Studio, was already stressed. The phone kept buzzing with messages from clients asking about class times, cancellations, and reschedules. A few members were upset because they showed up for a 7:00 AM yoga class that had been canceled at the last minute, but they didn’t get the memo.&lt;/p&gt;

&lt;p&gt;Alex glanced at the cluttered scheduling board behind the front desk—sticky notes, scribbled timings, and crossed-out classes. The system was messy, inefficient, and causing chaos not just for the members but also for Alex’s team.&lt;/p&gt;

&lt;p&gt;“I can’t keep running the studio like this,” Alex muttered, rubbing their temple. The situation was eating into their time and driving members away. If something didn’t change, Thrive Fitness Studio might not survive the next few months.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Turning Point
&lt;/h2&gt;

&lt;p&gt;Alex reached out to us after hearing about how we had helped another fitness studio streamline their membership management. “I need help,” Alex admitted during our first call. “My class scheduling is a nightmare, and my team is overwhelmed with reminders and last-minute changes.”&lt;/p&gt;

&lt;p&gt;We listened carefully and assured Alex, “There’s a way to make this simple and reliable—no more sticky notes, no more manual texting. Let us show you what automation can do.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: A Seamless Scheduling System
&lt;/h2&gt;

&lt;p&gt;After understanding Thrive Fitness Studio’s specific challenges, we built a custom no-code automation workflow tailored for their class scheduling needs.&lt;/p&gt;

&lt;p&gt;Here’s what we implemented:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Automated Class Scheduling and Updates:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using Airtable as the central scheduling hub, all class times, instructor assignments, and updates were managed in one place.&lt;/p&gt;

&lt;p&gt;Any changes (like canceled or rescheduled classes) were automatically synced to Thrive’s website and mobile app.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Personalized Member Reminders:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Members received automated reminders via email and SMS 24 hours and 1 hour before their scheduled class.&lt;/p&gt;

&lt;p&gt;These reminders included personalized details like the class name, instructor, and location.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Real-Time Notifications for Changes:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When a class was canceled or rescheduled, members were notified immediately with alternative options.&lt;/p&gt;

&lt;p&gt;Instructors also received notifications about schedule changes to avoid confusion.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Self-Service Booking Portal:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A user-friendly booking portal allowed members to check the schedule, sign up for classes, and even cancel their attendance—all without contacting the studio.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Attendance Tracking and Insights:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Automated check-ins and attendance tracking provided Alex with data on which classes were most popular, helping optimize the schedule further.&lt;/p&gt;

&lt;h2&gt;
  
  
  A New Day at Thrive Fitness Studio
&lt;/h2&gt;

&lt;p&gt;Two weeks after implementing the automation system, Alex noticed a huge difference.&lt;/p&gt;

&lt;p&gt;At 6:00 AM on a Monday, instead of being bombarded with calls and texts, Alex was sipping coffee and reviewing attendance data on the new Airtable dashboard. The class schedule was clear, reminders were going out automatically, and the sticky notes were gone for good.&lt;/p&gt;

&lt;p&gt;Clients loved the new system too. They felt informed, valued, and more inclined to show up for classes. “I never miss a yoga session now,” said Maria, one of Thrive’s loyal members. “The reminders are so helpful!”&lt;/p&gt;

&lt;p&gt;The instructors were equally relieved. No more frantic messages asking, “Do I have a class today?” Everything they needed was delivered straight to their phones.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Increased Class Attendance:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Attendance improved by 40%, as members were more aware of their schedules and received timely reminders.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Time Savings for the Team:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The team saved 15 hours per week, previously spent on manually handling schedules and reminders.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Higher Member Satisfaction:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Positive feedback highlighted the professionalism and reliability of the new system.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Improved Revenue:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fewer missed classes and better attendance resulted in a 20% increase in monthly revenue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Alex Says
&lt;/h2&gt;

&lt;p&gt;“This automation system was a lifesaver. It’s like having an extra staff member who never makes mistakes! Our studio feels more professional, and our members are happier than ever. I wish I had done this sooner.”&lt;/p&gt;

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

&lt;p&gt;Alex’s story shows how no-code automation can turn a chaotic scheduling system into a well-oiled machine. By automating repetitive tasks, fitness studios can focus on what truly matters—delivering exceptional experiences to their members.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get In Touch
&lt;/h2&gt;

&lt;p&gt;If your studio struggles with class scheduling, let’s work together to create a system that saves time and keeps your members coming back. Contact us today for a free consultation!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Case Study: Winning New Clients with Lead Generation Automation – A Fitness Brand’s Journey</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Sun, 05 Jan 2025 06:35:27 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/case-study-winning-new-clients-with-lead-generation-automation-a-fitness-brands-journey-4l4o</link>
      <guid>https://dev.to/damilare_abogunrin/case-study-winning-new-clients-with-lead-generation-automation-a-fitness-brands-journey-4l4o</guid>
      <description>&lt;h2&gt;
  
  
  The Quiet Struggle Behind the Scenes
&lt;/h2&gt;

&lt;p&gt;Emma owned PulseFit, a boutique fitness studio in Miami that had everything: top-notch trainers, a vibrant community, and a killer location. Yet, every month felt like an uphill battle to attract new clients and keep the studio thriving.&lt;/p&gt;

&lt;p&gt;“We’re doing everything right inside these walls,” Emma often told her team. “But out there? It’s like we don’t even exist to half the people who would love us.”&lt;/p&gt;

&lt;p&gt;PulseFit’s website saw traffic from curious visitors, but most left without signing up for a class or contacting the studio. The team tried juggling email follow-ups and promotional campaigns, but the workload became overwhelming. Leads slipped through the cracks.&lt;/p&gt;

&lt;p&gt;One day, Emma said, “There has to be a better way to turn website visitors into clients without us chasing them down.”&lt;/p&gt;

&lt;h2&gt;
  
  
  A New Vision for Lead Nurturing
&lt;/h2&gt;

&lt;p&gt;When Emma came to us, she was tired of spending more time on marketing than on her passion—helping people transform their health. She needed a system that would turn potential leads into paying clients while giving her time to focus on PulseFit’s operations.&lt;/p&gt;

&lt;p&gt;After a deep dive into PulseFit’s challenges and goals, we proposed a solution: a no-code automation workflow for lead generation and nurturing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Journey Toward Automation
&lt;/h2&gt;

&lt;p&gt;Unlike most lead-generation tools Emma had tried, our approach didn’t focus on flooding her inbox with unqualified leads. Instead, it emphasized building meaningful connections with potential clients and guiding them naturally toward membership.&lt;/p&gt;

&lt;p&gt;Here’s what we implemented:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Website Form Automation:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A revamped website form captured critical information (name, email, fitness goals). Submissions were automatically synced to Airtable for tracking.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Welcome Email Sequences:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every lead received a personalized welcome email within minutes, sharing a free class voucher and introducing them to PulseFit’s community.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Goal-Based Follow-Ups:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Based on the fitness goals shared in the form, leads were added to tailored email sequences offering relevant classes, success stories, and tips.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SMS Reminders for Class Trials:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For leads who redeemed the free class voucher, the system sent automated SMS reminders a day before their trial, ensuring they showed up.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Progressive Offers:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Leads who attended the trial but didn’t sign up received exclusive discounts via email a week later, with an invitation to join.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Centralized Lead Dashboard:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Emma and her team could track lead progress in real time, ensuring no one was forgotten.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Surprising Turnaround
&lt;/h2&gt;

&lt;p&gt;A month into the new system, Emma began noticing changes.&lt;/p&gt;

&lt;p&gt;Emails started rolling in with subject lines like, “Loved my first class!” or “Ready to sign up!” Leads who used to vanish after visiting the website now seemed eager to engage.&lt;/p&gt;

&lt;p&gt;“I was skeptical at first,” Emma admitted. “But seeing people respond so positively—it was like magic.”&lt;/p&gt;

&lt;p&gt;One lead, a busy professional named Laura, shared her story:&lt;br&gt;
“I’d been thinking about joining a gym for months but kept putting it off. When I got that first email from PulseFit, it felt like they really understood me. By the time I took the free class, I was ready to commit.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Lead Capture Rates Doubled:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Website form submissions increased by 110%, thanks to a clear call-to-action and instant follow-ups.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Trial Attendance Rates Improved:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Automated SMS reminders reduced no-shows by 40%.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Higher Conversion Rates:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tailored email sequences and progressive offers boosted lead-to-client conversion by 35%.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Time Saved:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Emma’s team spent 70% less time on manual follow-ups, allowing them to focus on delivering quality service.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ripple Effect
&lt;/h2&gt;

&lt;p&gt;By automating lead nurturing, PulseFit didn’t just grow its membership base—it also strengthened its reputation as a community-driven brand. Leads felt valued from the first interaction, setting the tone for long-term relationships.&lt;/p&gt;

&lt;p&gt;Emma reflected, “I’ve stopped feeling like I’m chasing people. Now, they’re coming to us because they see the value we offer.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Your Turn to Thrive
&lt;/h2&gt;

&lt;p&gt;Emma’s story is proof that modern fitness studios can thrive with the right tools. By automating lead generation and nurturing, you can save time, boost sign-ups, and build stronger connections with potential clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  Book a Call
&lt;/h2&gt;

&lt;p&gt;Ready to grow your fitness brand without the stress? Let’s chat about how automation can transform your lead generation strategy. Book your free consultation today!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Build a Free Telegram Bot to Send and Receive Images Using Python</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Tue, 31 Dec 2024 09:10:09 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/ow-to-build-a-free-telegram-bot-to-send-and-receive-images-using-python-3jjd</link>
      <guid>https://dev.to/damilare_abogunrin/ow-to-build-a-free-telegram-bot-to-send-and-receive-images-using-python-3jjd</guid>
      <description>&lt;p&gt;Telegram bots are powerful tools that can be used to automate tasks, interact with users, and manage operations. In this guide, you’ll learn how to build a Telegram bot capable of sending and receiving images using Python. We'll also show you how to store these images in a database for secure and convenient access—all with free tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Setting Up Your Telegram Bot
&lt;/h2&gt;

&lt;p&gt;To start, you need to create a bot on Telegram using BotFather:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open Telegram and search for "BotFather."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start a chat with BotFather and use the /newbot command.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Follow the instructions to create your bot and receive your bot's unique API token.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Save this token; you’ll use it in your Python script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Installing Required Tools
&lt;/h2&gt;

&lt;p&gt;Before coding, set up your environment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install Python on your system from python.org.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install the required Python libraries:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;pip install python-telegram-bot sqlite3 requests&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Setting Up the Database
&lt;/h2&gt;

&lt;p&gt;We’ll use SQLite to manage the bot’s image data because it’s lightweight and free.&lt;/p&gt;

&lt;p&gt;Create an images.db file and initialize the database structure in your Python script:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```import sqlite3&lt;/p&gt;

&lt;p&gt;def init_db():&lt;br&gt;
    conn = sqlite3.connect("images.db")&lt;br&gt;
    cursor = conn.cursor()&lt;br&gt;
    cursor.execute("""&lt;br&gt;
    CREATE TABLE IF NOT EXISTS images (&lt;br&gt;
        id INTEGER PRIMARY KEY,&lt;br&gt;
        file_id TEXT NOT NULL,&lt;br&gt;
        file_path TEXT NOT NULL&lt;br&gt;
    )&lt;br&gt;
    """)&lt;br&gt;
    conn.commit()&lt;br&gt;
    conn.close()&lt;/p&gt;

&lt;p&gt;init_db()&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;



## Step 4: Writing the Python Code
Here’s the complete script for the bot:



```from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
import sqlite3
import os

# Database initialization
def init_db():
    conn = sqlite3.connect("images.db")
    cursor = conn.cursor()
    cursor.execute("""
    CREATE TABLE IF NOT EXISTS images (
        id INTEGER PRIMARY KEY,
        file_id TEXT NOT NULL,
        file_path TEXT NOT NULL
    )
    """)
    conn.commit()
    conn.close()

def save_image(file_id, file_path):
    conn = sqlite3.connect("images.db")
    cursor = conn.cursor()
    cursor.execute("INSERT INTO images (file_id, file_path) VALUES (?, ?)", (file_id, file_path))
    conn.commit()
    conn.close()

def start(update: Update, context: CallbackContext):
    update.message.reply_text("Welcome! Send me an image, and I'll store it.")

def handle_image(update: Update, context: CallbackContext):
    photo = update.message.photo[-1]  # Get the highest resolution image
    file_id = photo.file_id
    file = context.bot.get_file(file_id)
    file_path = f"images/{file_id}.jpg"

    os.makedirs("images", exist_ok=True)
    file.download(file_path)  # Save the image locally

    save_image(file_id, file_path)
    update.message.reply_text("Image saved successfully!")

def get_image(update: Update, context: CallbackContext):
    conn = sqlite3.connect("images.db")
    cursor = conn.cursor()
    cursor.execute("SELECT file_path FROM images ORDER BY id DESC LIMIT 1")
    result = cursor.fetchone()
    conn.close()

    if result:
        update.message.reply_photo(open(result[0], "rb"))
    else:
        update.message.reply_text("No images found.")

# Main function
def main():
    init_db()

    TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"
    updater = Updater(TOKEN)
    dp = updater.dispatcher

    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(MessageHandler(Filters.photo, handle_image))
    dp.add_handler(CommandHandler("get_image", get_image))

    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Running the Bot
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Save the script as bot.py.&lt;/li&gt;
&lt;li&gt;Run the script using:
&lt;code&gt;python bot.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Interact with your bot by sending an image and using the /get_image command to retrieve the latest stored image.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 6: Deploying the Bot for Free
&lt;/h2&gt;

&lt;p&gt;You can deploy the bot for free using platforms like PythonAnywhere or run it on your local machine. For online deployment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign up on PythonAnywhere.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upload your script and run it on their free tier.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;With this guide, you’ve built a Telegram bot that sends and receives images and stores them securely. The tools used are completely free, making this project budget-friendly while providing powerful functionality.&lt;/p&gt;

&lt;p&gt;Feel free to customize the bot further, such as adding authentication or cloud storage integration.&lt;/p&gt;

&lt;p&gt;Start creating more useful bots to automate your tasks and enhance your operations!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a Personalized Workout Tracker with Google Apps Script</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Thu, 05 Dec 2024 16:01:21 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/building-a-personalized-workout-tracker-with-google-apps-script-1m37</link>
      <guid>https://dev.to/damilare_abogunrin/building-a-personalized-workout-tracker-with-google-apps-script-1m37</guid>
      <description>&lt;p&gt;In this article, I’ll walk you through how I built a Personalized Workout Tracker using Google Apps Script. This tool allows users to log their workout activities, store the data in Google Sheets, and receive weekly progress reports via email. The inspiration came from my desire to automate fitness tracking while keeping the process simple and accessible for anyone with a Google account.&lt;/p&gt;

&lt;p&gt;If you’ve read my previous article on building an automated workflow with Airtable, Zapier, and ChatGPT, you’ll notice a similar step-by-step approach here. Let’s dive into it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Setting the Foundation with Google Forms
&lt;/h2&gt;

&lt;p&gt;The first step was to create a Google Form that users can fill out to log their workouts. Here's what I included in the form:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: A short text field to identify the user.&lt;/li&gt;
&lt;li&gt;Email Address: Essential for sending weekly progress reports.&lt;/li&gt;
&lt;li&gt;Date of Workout: To track when the workout was performed.&lt;/li&gt;
&lt;li&gt;Type of Workout: A dropdown menu with options like Cardio, Strength, Yoga, etc.&lt;/li&gt;
&lt;li&gt;Duration: A number field to record the time spent on the workout (in minutes).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Once the form was ready, I linked it to a Google Sheet where all responses would be stored. You can do this by clicking the "Responses" tab in the form and selecting the green Sheets icon.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Step 2: Exploring the Linked Google Sheet
&lt;/h2&gt;

&lt;p&gt;The linked Google Sheet served as the backend for my workout tracker. Each submission from the form was automatically logged as a new row. I renamed the sheet to Workout Data for clarity.&lt;/p&gt;

&lt;p&gt;The columns in the sheet looked like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Email Address&lt;/li&gt;
&lt;li&gt;Date of Workout&lt;/li&gt;
&lt;li&gt;Type of Workout&lt;/li&gt;
&lt;li&gt;Duration (Minutes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add a screenshot of the Google Sheet with sample data here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Writing the Google Apps Script
&lt;/h2&gt;

&lt;p&gt;Here’s where the magic happens. I wrote a script to process the workout data, summarize it, and email a weekly progress report to each user.&lt;/p&gt;

&lt;p&gt;To access the Apps Script editor, I opened the Google Sheet and navigated to Extensions &amp;gt; Apps Script. Here’s the script I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function sendWeeklyProgressReports() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Workout Data");
  const data = sheet.getDataRange().getValues();

  const headers = data[0];
  const records = data.slice(1);

  const emailIndex = headers.indexOf("Email Address");
  const nameIndex = headers.indexOf("Name");
  const workoutTypeIndex = headers.indexOf("Type of Workout");
  const durationIndex = headers.indexOf("Duration (Minutes)");
  const dateIndex = headers.indexOf("Date of Workout");

  const userMap = {};

  records.forEach(record =&amp;gt; {
    const email = record[emailIndex];
    const name = record[nameIndex];
    const workoutType = record[workoutTypeIndex];
    const duration = record[durationIndex];
    const date = record[dateIndex];

    if (!userMap[email]) {
      userMap[email] = { name, workouts: [] };
    }

    userMap[email].workouts.push({ workoutType, duration, date });
  });

  for (const [email, userData] of Object.entries(userMap)) {
    const name = userData.name;
    const workouts = userData.workouts;

    let emailBody = `Hi ${name},\n\nHere's your workout summary for the week:\n\n`;
    let totalDuration = 0;

    workouts.forEach(workout =&amp;gt; {
      emailBody += `- ${workout.date}: ${workout.workoutType}, ${workout.duration} minutes\n`;
      totalDuration += workout.duration;
    });

    emailBody += `\nTotal workout duration: ${totalDuration} minutes\n\nKeep up the great work!\n\nBest regards,\nYour Workout Tracker`;

    GmailApp.sendEmail(email, "Your Weekly Workout Summary", emailBody);
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script collects the data from the Google Sheet, groups it by user, and sends an email summary for the week.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Automating the Process with Triggers
&lt;/h2&gt;

&lt;p&gt;To make the script run automatically every week, I set up a time-based trigger.&lt;/p&gt;

&lt;p&gt;Here’s how:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the Apps Script editor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the clock icon for Triggers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the function sendWeeklyProgressReports to run weekly (e.g., every Sunday at 9:00 AM).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add a screenshot showing the trigger setup here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Adding Optional Features
&lt;/h2&gt;

&lt;p&gt;To make the tracker more visually engaging, I added a dashboard in the Google Sheet. This dashboard included charts and pivot tables to show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workout types distribution.&lt;/li&gt;
&lt;li&gt;Weekly workout duration trends.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can create these visualizations using Google Sheets' built-in chart tools.&lt;/p&gt;

&lt;p&gt;Add a screenshot of the dashboard here.&lt;/p&gt;

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

&lt;p&gt;This personalized workout tracker demonstrates how you can use Google Apps Script to simplify repetitive tasks and provide meaningful insights to users. The flexibility of Apps Script allowed me to create a solution that is both functional and easy to scale.&lt;/p&gt;

&lt;p&gt;If you’re looking to build something similar or want to adapt this idea for other use cases, I encourage you to explore the possibilities of Google Apps Script. Let me know how it works for you!&lt;/p&gt;

&lt;p&gt;Add a closing screenshot of the email summary or a visualization here.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If this inspires you to build something of your own, check out my article on automating workflows for more ideas!&lt;/p&gt;

&lt;p&gt;What would you build next? Let me know in the comments!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>googleappscript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Herb Substitutes: What to Use When You’re Out of Rosemary</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Wed, 14 Aug 2024 01:40:23 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/herb-substitutes-what-to-use-when-youre-out-of-rosemary-3b57</link>
      <guid>https://dev.to/damilare_abogunrin/herb-substitutes-what-to-use-when-youre-out-of-rosemary-3b57</guid>
      <description>&lt;p&gt;Rosemary's distinctive flavor profile, with its piney, camphor, and lemon notes, makes it a popular herb in various cuisines. However, when rosemary is unavailable, finding suitable substitutes can be challenging. This article explores the unique flavor compounds that contribute to rosemary's taste and aroma, making it an essential herb in Mediterranean, Italian, and American cooking. &lt;/p&gt;

&lt;p&gt;We'll discuss top herb substitutes like thyme, sage, oregano, and basil, as well as non-herb alternatives like herb blends and spices, to help you find the perfect replacement in your recipes. Learn how to adjust cooking times and quantities to ensure a seamless substitution and discover the best alternatives for different culinary traditions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbxhhsj2pc7nx89pup1e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbxhhsj2pc7nx89pup1e.jpg" alt="Image description" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Rosemary’s Unique Flavor Profile
&lt;/h2&gt;

&lt;p&gt;Rosemary possesses a distinctive flavor profile that sets it apart from other herbs. Its taste is characterized by a strong, piney essence accompanied by notes of camphor, eucalyptus, and a hint of lemon. The herb's aroma is equally potent, evoking images of Mediterranean hillsides and forest undergrowth.&lt;/p&gt;

&lt;p&gt;The primary flavor compounds in rosemary include 1,8-cineole (eucalyptol), α-pinene, and camphor. These contribute to its woody, evergreen taste and fragrance. Additionally, rosemary contains rosmarinic acid, which imparts a slightly bitter, astringent quality.&lt;/p&gt;

&lt;p&gt;In culinary applications, rosemary's robust flavor profile makes it a popular choice for seasoning meats, particularly lamb and poultry. Its intensity allows it to stand up to long cooking times, making it ideal for roasts, stews, and braised dishes. The herb's piney notes complement root vegetables and potatoes, while its slightly resinous quality pairs well with olive oil and garlic in Mediterranean cuisine.&lt;/p&gt;

&lt;p&gt;When considering substitutes, it's crucial to account for rosemary's complex flavor profile. While no single herb can perfectly replicate its taste, combinations of sage, thyme, and marjoram can approximate some of its characteristics in recipes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Top Substitutes for Rosemary
&lt;/h2&gt;

&lt;p&gt;When rosemary is unavailable, several other herbs can step in to provide similar flavor profiles or complementary tastes. While no substitute can perfectly replicate rosemary's unique combination of piney, earthy, and slightly citrusy notes, these four alternatives can often fill the gap admirably.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thyme: Thyme shares rosemary's earthy undertones. Its flavor is milder and more delicate, so cooks should use about 1.5 times the amount of thyme compared to rosemary. Thyme works particularly well in poultry dishes, soups, and vegetable-based recipes. For optimal results, add thyme earlier in the cooking process to allow its flavors to infuse fully. &lt;/li&gt;
&lt;li&gt;Sage: Sage offers a robust, slightly peppery flavor that can stand in for rosemary in heartier dishes. Its strong taste means it should be used more sparingly – about 2/3 the amount called for rosemary. Sage excels in meat dishes, especially pork and poultry, and pairs well with root vegetables. &lt;/li&gt;
&lt;li&gt;Oregano: Oregano shares some of rosemary's earthy and slightly bitter notes, making it a versatile substitute. Use an equal amount of oregano to replace rosemary in recipes. It works well in Mediterranean and Italian dishes, particularly those featuring tomatoes, olive oil, or grilled meats. Fresh oregano has a more delicate flavor than its dried counterpart, so adjust quantities accordingly. &lt;/li&gt;
&lt;li&gt;Basil: While basil has a different flavor profile from rosemary, it can provide a fresh, slightly sweet alternative in certain recipes. Use about 3/4 the amount of basil compared to rosemary. It's best suited for lighter dishes, especially those with tomatoes, pasta, or fish. Basil's delicate leaves are sensitive to heat, so add it towards the end of cooking to preserve its flavor. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Non-Herb Alternatives
&lt;/h2&gt;

&lt;p&gt;When traditional herb substitutes for rosemary are unavailable, cooks can turn to other options to achieve similar flavor profiles in their dishes. These alternatives, while not herbs themselves, can often provide comparable aromatic experiences.  Let's explore two categories of non-herb alternatives that can viably stand in for rosemary.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Herb Blends: Pre-mixed herb blends can offer a convenient alternative to rosemary. Many commercial blends, such as herbes de Provence or Italian seasoning, contain rosemary as a component. These mixtures can provide a complex flavor profile that includes notes similar to rosemary. When substituting, use about 3/4 teaspoon of herb blend for every teaspoon of rosemary called for in the recipe.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spice Substitutes: Certain spices can mimic some of rosemary's characteristics. Coriander seeds, when lightly toasted and ground, offer a citrusy, slightly piney flavor reminiscent of rosemary. Use about 1/2 teaspoon of ground coriander for each teaspoon of dried rosemary. Alternatively, fennel seeds provide a sweet, licorice-like taste with hints of pine. &lt;/p&gt;
&lt;h2&gt;
  
  
  How to Adjust Cooking Times and Quantities
&lt;/h2&gt;

&lt;p&gt;When substituting herbs for rosemary, consider how the alternative's flavor profile, potency, and cooking characteristics differ from the original herb. These factors can significantly impact the final taste of a dish. The following tips will help ensure that your substitutions are successful:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start with less and adjust gradually: Begin by using about two-thirds of the amount of substitute herb compared to the rosemary called for in the recipe. This conservative approach allows for gradual adjustment without overwhelming the dish. Taste the food periodically during cooking and add more of the substitute herb if needed. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consider the herb's potency: Assess the substitute herb's strength relative to rosemary. For milder herbs like thyme, increase the quantity by about 25%. For stronger herbs like sage, reduce the amount by roughly 30%. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adjust cooking times based on herb characteristics: Rosemary is robust and can withstand long cooking times. For more delicate substitutes like basil or parsley, add them towards the end of cooking to preserve their flavor and aroma. Hardier herbs like thyme or sage can be added earlier but may still benefit from a slightly reduced cooking time compared to rosemary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Layer flavors for complex substitutes: When using a combination of herbs to replace rosemary, add them at different stages of cooking. For example, introduce thyme early in the process for depth, then add basil near the end for brightness. This layering technique can help create a more complex flavor profile that better mimics rosemary's multifaceted taste.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Account for texture differences: Rosemary has sturdy, needle-like leaves that can be left whole in some dishes. When using leafy substitutes like basil or oregano, chop or tear them to release their flavors more effectively. For woody-stemmed herbs like thyme, strip the leaves from the stems before using. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8komvjcywuzafzmov1n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8komvjcywuzafzmov1n.jpg" alt="Image description" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Substitutes in Different Cuisines
&lt;/h2&gt;

&lt;p&gt;When seeking alternatives to rosemary, it's essential to consider the specific cuisine and dish in question. Different culinary traditions use rosemary in unique ways, and the most appropriate substitute may vary depending on the flavor profile and cooking methods associated with each cuisine. Let's explore how various substitutes can be effectively employed across different culinary traditions.&lt;/p&gt;

&lt;p&gt;In Mediterranean cuisine, where rosemary is a staple herb, thyme often serves as the best substitute. Its earthy, slightly minty flavor complements the olive oil-based dishes and grilled meats common in this region. For Greek dishes, oregano can be an excellent alternative, offering a similar pungency that pairs well with lemon and garlic. &lt;/p&gt;

&lt;p&gt;Italian cuisine frequently calls for rosemary in meat dishes and focaccia. Here, sage can be an effective replacement, particularly in recipes featuring pork or poultry. For tomato-based sauces and pasta dishes, a combination of thyme and basil can provide a complex flavor that echoes rosemary's contribution. &lt;/p&gt;

&lt;p&gt;In American cuisine, which often incorporates rosemary in roasted meats and potatoes, sage is a popular substitute. Its robust flavor stands up well to long cooking times and complements rich dishes. For lighter American fare, such as herb-crusted fish or vegetable dishes, a mixture of thyme and parsley can provide a fresh, herbaceous quality similar to rosemary.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;1 - What makes rosemary's flavor profile unique?&lt;br&gt;
Rosemary's flavor profile is characterized by a strong, piney essence accompanied by notes of camphor, eucalyptus, and a hint of lemon, making it a distinctive herb in various cuisines.&lt;/p&gt;

&lt;p&gt;2 - What are the top substitutes for rosemary?&lt;br&gt;
The top substitutes for rosemary are thyme, sage, oregano, and basil, each offering similar flavor profiles or complementary tastes that can fill the gap in recipes.&lt;/p&gt;

&lt;p&gt;3 - How do I adjust cooking times and quantities when substituting herbs for rosemary?&lt;br&gt;
When substituting herbs for rosemary, start with less and adjust gradually, considering the alternative's flavor profile, potency, and cooking characteristics to ensure a seamless substitution.&lt;/p&gt;

&lt;p&gt;4 - What non-herb alternatives can I use in place of rosemary?&lt;br&gt;
Non-herb alternatives like herb blends (e.g., herbes de Provence) and spices (e.g., coriander seeds, fennel seeds) can provide comparable aromatic experiences and flavor profiles similar to rosemary.&lt;/p&gt;

&lt;p&gt;5 - How do I choose the best substitute for rosemary in different cuisines?&lt;br&gt;
When seeking alternatives to rosemary, consider the specific cuisine and dish, as different culinary traditions use rosemary in unique ways, and the most appropriate substitute may vary depending on the flavor profile and cooking methods.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Alternatives to Amaretto: Improving Your Cocktail</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Wed, 14 Aug 2024 00:29:59 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/alternatives-to-amaretto-improving-your-cocktail-1adm</link>
      <guid>https://dev.to/damilare_abogunrin/alternatives-to-amaretto-improving-your-cocktail-1adm</guid>
      <description>&lt;p&gt;Amaretto, a sweet almond-flavored Italian liqueur, has been a staple in bars and households for centuries. However, its distinctive taste and ingredients may not suit everyone's preferences or dietary needs. This article explores alternatives to Amaretto, including non-alcoholic options like almond extract and orgeat syrup, as well as alcoholic substitutes like Frangelico and Disaronno. &lt;/p&gt;

&lt;p&gt;Whether you're looking to accommodate dietary restrictions, reduce alcohol content, or experiment with new flavors, these alternatives offer versatile solutions for mixologists and home bartenders. Discover how to substitute Amaretto in cocktails and create unique, delicious drinks that cater to various tastes and preferences.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;strong&gt;What is Amaretto?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Amaretto is a sweet, almond-flavored Italian liqueur that has been a staple in bars and households for centuries. Despite its name, which translates to "a little bitter" in Italian, Amaretto is known for its distinctively sweet taste. Traditionally, it is made from a base of apricot pits or almonds, or a combination of both, which are infused in alcohol and then sweetened.&lt;/p&gt;

&lt;p&gt;The liqueur typically has an alcohol content ranging from 21% to 28% ABV (Alcohol By Volume), making it a moderately strong spirit. Its flavor profile is complex, featuring prominent notes of almonds and vanilla, often accompanied by subtle hints of cherry or peach, depending on the brand and recipe.&lt;/p&gt;

&lt;p&gt;Amaretto's origins are debated, with several Italian families claiming to have invented it. One popular legend attributes its creation to the Lazzaroni family in Saronno, Italy, in 1851. However, other stories trace its roots back to the 16th century in the same region.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Substitute Amaretto?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Substituting Amaretto in cocktails is often necessary for several reasons. One common concern is dietary restrictions. Traditional Amaretto contains alcohol and almonds, making it unsuitable for individuals avoiding alcohol or those with nut allergies. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dietary Restrictions: Amaretto often contains allergens like almonds and may not be suitable for those with nut allergies. Additionally, its high sugar content (up to 25g per 100ml) makes it problematic for individuals managing diabetes or following low-sugar diets.&lt;/li&gt;
&lt;li&gt;Alcohol Content: With an alcohol content typically ranging from 21% to 28% ABV, Amaretto may be too strong for some preferences. Non-alcoholic alternatives allow for the creation of mocktails or lower-alcohol cocktails.&lt;/li&gt;
&lt;li&gt;Flavor Experimentation: While Amaretto has a distinct taste, exploring substitutes opens up new flavor profiles in cocktails. Alternatives like Frangelico or homemade syrups can introduce nuanced differences.&lt;/li&gt;
&lt;li&gt;Cost Considerations: Quality Amaretto can be expensive, with prices ranging from $20 to $50 per bottle. Homemade alternatives or using smaller quantities of concentrated flavorings can be more cost-effective.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Best Non-Alcoholic Substitutes&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For those seeking to enjoy the distinctive almond flavor of Amaretto without the alcohol content, several non-alcoholic alternatives can effectively mimic its taste profile. Almond extract stands out as a primary substitute, offering a concentrated essence that can be diluted to achieve the desired intensity. &lt;/p&gt;

&lt;p&gt;Orgeat syrup, a sweet syrup made from almonds, sugar, and orange flower water, presents another viable option. Its rich, nutty flavor and slight floral notes closely resemble Amaretto's complexity. When using orgeat as a substitute, mixologists often recommend a 1:1 ratio replacement in cocktails.&lt;/p&gt;

&lt;p&gt;For a more nuanced approach, bartenders and home enthusiasts have found success with a custom blend of almond and vanilla extracts. This combination, usually in a 2:1 ratio of almond to vanilla, can capture both the nutty essence and the subtle sweetness characteristic of Amaretto. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Alcoholic Alternatives&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For those seeking alcoholic substitutes for Amaretto, several liqueurs offer comparable flavor profiles that can elevate cocktails in similar ways. Frangelico, a hazelnut liqueur, provides a nutty sweetness reminiscent of Amaretto, albeit with a distinct hazelnut character. Its alcohol content, typically around 20% ABV, aligns closely with Amaretto's usual 21-28% ABV range, making it a suitable replacement in most recipes.&lt;/p&gt;

&lt;p&gt;Disaronno, often mistaken for a traditional Amaretto, offers a unique almond-like flavor derived from apricot kernel oil rather than almonds. With an alcohol content of 28% ABV, it can be used as a direct substitute in cocktails, often in equal measure to the Amaretto called for in recipes.&lt;/p&gt;

&lt;p&gt;Adventurous mixologists might consider crafting a homemade almond liqueur. A basic recipe often involves steeping blanched almonds in vodka for several weeks, then sweetening the strained liquid with simple syrup. The alcohol content can be adjusted by varying the ratio of vodka to syrup, typically ranging from 20-30% ABV to match commercial Amaretto.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Creative Cocktails with Amaretto Substitutes&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Innovative mixologists have developed numerous cocktails that showcase Amaretto substitutes, proving that these alternatives can create equally delightful and complex drinks. One such creation is the "Nutty Nightcap," which replaces Amaretto with Frangelico. This cocktail combines 1.5 oz Frangelico, 1 oz vodka, and 0.5 oz cream, shaken with ice and strained into a chilled glass, then garnished with grated nutmeg.&lt;/p&gt;

&lt;p&gt;For those preferring non-alcoholic options, the "Almond Joy Mocktail" offers a sweet, nutty experience. It blends 1 oz orgeat syrup, 2 oz coconut cream, 1 oz chocolate syrup, and 4 oz almond milk, shaken vigorously with ice and served in a tall glass over fresh ice, topped with whipped cream and a sprinkle of cocoa powder.&lt;/p&gt;

&lt;p&gt;Disaronno shines in the "Apricot Sunrise," a twist on the classic Amaretto Sour. This cocktail mixes 2 oz Disaronno, 1 oz fresh lemon juice, 0.5 oz apricot nectar, and 0.25 oz simple syrup. The ingredients are shaken with ice, strained into an ice-filled glass, and topped with a splash of grenadine for a striking visual effect.&lt;/p&gt;

&lt;p&gt;For those experimenting with homemade almond liqueur, the "DIY Almond Fizz" provides a refreshing option. It combines 1.5 oz homemade almond liqueur with 0.5 oz fresh lime juice and 3 oz club soda, stirred gently in a highball glass filled with ice and gaxrnished with a lime wheel and a few drops of orange blossom water for aromatic complexity.&lt;/p&gt;

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

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

&lt;p&gt;Amaretto, a sweet almond-flavored Italian liqueur with 21-28% ABV, has several alternatives that cater to various needs and preferences. Non-alcoholic substitutes like almond extract (1/4 to 1/2 teaspoon per ounce of liquid) and orgeat syrup (1:1 ratio replacement) offer similar flavors without alcohol. Alcoholic alternatives include Frangelico (20% ABV) and Disaronno (28% ABV), which can be used in equal measures to Amaretto in cocktails.&lt;/p&gt;

&lt;p&gt;Reasons for substitution include dietary restrictions, alcohol content concerns, flavor experimentation, and cost considerations. Creative cocktails using these substitutes, such as the "Nutty Nightcap" with Frangelico or the non-alcoholic "Almond Joy Mocktail," demonstrate the versatility of these alternatives in mixology.&lt;/p&gt;

&lt;p&gt;Whether opting for non-alcoholic options or exploring other liqueurs, these substitutes allow for the creation of flavorful cocktails that capture the essence of Amaretto while accommodating various preferences and dietary needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;FAQs&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;1 - What are the primary reasons for substituting Amaretto in cocktails?&lt;br&gt;
The primary reasons for substituting Amaretto include dietary restrictions, alcohol content concerns, flavor experimentation, and cost considerations.&lt;/p&gt;

&lt;p&gt;2 - What is a popular non-alcoholic substitute for Amaretto?&lt;br&gt;
Almond extract is a popular non-alcoholic substitute for Amaretto, offering a concentrated essence that can be diluted to achieve the desired intensity.&lt;/p&gt;

&lt;p&gt;3 - Can Frangelico be used as a direct substitute for Amaretto in cocktails?&lt;br&gt;
Yes, Frangelico can be used as a direct substitute for Amaretto in cocktails, as its alcohol content (20% ABV) aligns closely with Amaretto's usual 21-28% ABV range.&lt;/p&gt;

&lt;p&gt;4 - What is the flavor profile of Disaronno, an alcoholic substitute for Amaretto?&lt;br&gt;
Disaronno offers a unique almond-like flavor derived from apricot kernel oil, with an alcohol content of 28% ABV.&lt;/p&gt;

&lt;p&gt;5 - Can homemade almond liqueur be used as a substitute for Amaretto?&lt;br&gt;
Yes, homemade almond liqueur can be used as a substitute for Amaretto, with a basic recipe involving steeping blanched almonds in vodka and sweetening with simple syrup.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a Streamlined Workflow between Google Forms, Google Sheets and Looker Studio</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Mon, 19 Feb 2024 13:34:09 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/building-a-streamlined-workflow-between-google-forms-google-sheets-and-looker-studio-572j</link>
      <guid>https://dev.to/damilare_abogunrin/building-a-streamlined-workflow-between-google-forms-google-sheets-and-looker-studio-572j</guid>
      <description>&lt;p&gt;So, I stumbled on this gig recently. The client needed a clear-cut path worked out between the trio of all previously mentioned Google Tools. Considering all tools needed for the task were Google-based, integration was quite easy. There was zero need for connectors like Zapier nor scripting code for API intercoms. Essentially,&lt;/p&gt;

&lt;p&gt;Google Forms - Collects Data&lt;br&gt;
Google Sheets - Stores Collected Data &lt;br&gt;
Looker Studio - Enables visualization and analysis of collected data. &lt;/p&gt;

&lt;p&gt;Ive explored how those tools were connected to build out the desired workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started with Google Forms
&lt;/h2&gt;

&lt;p&gt;To get started, I created the following basic Google Form to facilitate data collection. Considering the client didn't specify the datatypes to be collected. I revolved the datatypes around sales. Since the solutions were definitely business oriented, seemed pretty apt to me.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fob8zvxeh4d1qtimw0aws.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fob8zvxeh4d1qtimw0aws.JPG" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSc--Bkg1wP2-uw4pyeqQUNxD6VqHT3oEnUqyJ4T01Q8EfSfmw/viewform"&gt;https://docs.google.com/forms/d/e/1FAIpQLSc--Bkg1wP2-uw4pyeqQUNxD6VqHT3oEnUqyJ4T01Q8EfSfmw/viewform&lt;/a&gt;&lt;br&gt;
So, when a sales rep fills out sales details in the provided Google form, the response gets  stored automatically on the Google sheets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streamlining Data Storage with Google Sheets
&lt;/h2&gt;

&lt;p&gt;Google Sheets is where the project gets tricky. Considering I have zero actual sales reps to fill out the data I needed, I resorted to Mockaroo to work up a mock dataset I could work with.&lt;/p&gt;

&lt;p&gt;Here's my Mockaroo adjustments:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53q9lkxqfx5m8yo9wj8f.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53q9lkxqfx5m8yo9wj8f.JPG" alt="Image description" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the data set neatly outlined in my Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagcary5dq1m7fwtvsl8m.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagcary5dq1m7fwtvsl8m.JPG" alt="Image description" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Unlocking Insights with Looker Studio
&lt;/h2&gt;

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

</description>
      <category>visualizations</category>
    </item>
    <item>
      <title>Building Out a Complex Social Media Content Automated Workflow with Airtable, Zapier, and ChatGPT</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Fri, 14 Apr 2023 08:27:43 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/building-out-a-complex-social-media-content-automated-workflow-with-airtable-zapier-chatgpt-and-google-apps-script-3hn9</link>
      <guid>https://dev.to/damilare_abogunrin/building-out-a-complex-social-media-content-automated-workflow-with-airtable-zapier-chatgpt-and-google-apps-script-3hn9</guid>
      <description>&lt;p&gt;In this guide, I'll dive deep into the dynamics of automating your social media posting strategy. Right from content and image generation with ChatGPT and DALLE respectively, to automated storage on a custom Airtable database, to automated post scheduling on Facebook and Instagram with Zapier. &lt;/p&gt;

&lt;p&gt;Although I've chosen to store the generated content on Airtable, you could opt for Google Sheets instead, or even a traditional database while you build a UI around it. As long as you understand how to build out the application logic for your preferred platform, you'll be fine. &lt;/p&gt;

&lt;h2&gt;
  
  
  Packages Needed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Airtable&lt;/li&gt;
&lt;li&gt;OpenAI API Key (preferably with a text-davinci model bought)&lt;/li&gt;
&lt;li&gt;Zapier (the free plan would work for our application, for more intensive enterprise usage, consider purchasing a paid plan)&lt;/li&gt;
&lt;li&gt;Facebook Page with a Linked Instagram Account.&lt;/li&gt;
&lt;li&gt;Google Drive Account to Host Generates Images from DALLE &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Guide
&lt;/h2&gt;

&lt;p&gt;The guide will be divided into four relevant sections:&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up the Airtable Base
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Head over to your Airtable Account and Create a New Base.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a table and name it whatever you want. My Table here is named IG Posts. For our Workflow, we require that the following fields need be set up: Date, Captions + Hashtags, Type of Image, Image URL, and Timestamp, &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For simplicity and to ensure that we do not overstep Zapier's free plan offerings, we'll post five days a month, at regular intervals, starting on the 5th of the month. As such, our last posting date would be the 25th of any month. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Head over to the Scripting Extension. Here's a script to setup the date parameters in Airtable. We've covered from April till December:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let table = base.getTable('Posts Data');
let { records } = await table.selectRecordsAsync();

const startDate = new Date('March 5, 2023');
const endDate = new Date('December 31, 2023');

const increment = 5; // Increment in days

// Loop through each record in the table
for (const record of records) {
  const dateField = record.getCellValue('Date Field');
  let currentMonth = startDate.getMonth();

  // If the date field is empty or null, set it to the next date in the sequence
  if (!dateField) {
    let currentDate = startDate;

    while (currentDate &amp;lt;= endDate) {
      // Check if we're still in the same month
      if (currentDate.getMonth() === currentMonth) {
        // Set the date field for the current record
        await table.updateRecordAsync(record, {
          'Date Field': currentDate
        });

        // Increment the date by the specified increment
        currentDate.setDate(currentDate.getDate() + increment);
      } else {
        // If we've reached the end of the month, move to the next month
        currentMonth = currentDate.getMonth();
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pull Out Content from ChatGPT
&lt;/h3&gt;

&lt;p&gt;5- Now that our Date field is all setup and we've established our posting dates, we must now generate relevant Captions and Hashtags for the post, alongside keywords to feed into DALLE. The simple script below covers that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let table = base.getTable('Projects');
let trecords = await table.selectRecordsAsync();
let captions = table.getField("Captions");

const len = trecords.records.length;

    const apiUrl = "https://api.openai.com/v1/chat/completions"; 

    const options = {
        method: 'POST',
        headers: {
            'Authorization': 'Bearer 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',
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
        model: "gpt-3.5-turbo",
        messages: [
            { role: "assistant", 
            content: "Act like a social media assistant and generate a caption for a social media post scheduled on keep it strictly less than 220 characters. Spice it with emoticons"
            }
        ],
    }),
    };

    console.log(options);
    const response = await fetch(apiUrl, options);
    const jsn = await response.json();

    console.log(jsn);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scheduling your Posts with Zapier
&lt;/h3&gt;

&lt;p&gt;6- Head over to your Zapier account. If you've got a Paid plan, great! If not, a Free Plan would actually work just fine. We'll post to a Facebook Group, as well as an IG page. The timestamp field would be of relevance here to moderate the scheduling.&lt;/p&gt;

&lt;p&gt;7- Connect your Zap to the Airtable Base, as well as the relevant table. Adjust the timestamp field to moderate your automation.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcn90xzjylguzavw5ftjr.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcn90xzjylguzavw5ftjr.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8- To connect the zap to your Facebook group, sign-in to your account. Link the appropriate fields.&lt;/p&gt;

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

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

&lt;p&gt;Automating your social media content strategy sure would save you a great deal of time and allow you to concentrate on more demanding business activities. Our outline here is more than sufficient to take care of your regular Facebook and Instagram updates. However, you can always extend to other social media platforms including LinkedIn or Twitter. As long as you choose to work with Airtable and Zapier, the code basically would remain the same, or you can tweak to your preferrences.&lt;/p&gt;

</description>
      <category>airtable</category>
      <category>zapier</category>
      <category>chatgpt</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Exporting CSV Data from Real Estate Website with BS4</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Fri, 07 Apr 2023 15:26:12 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/exporting-csv-data-from-real-estate-website-with-bs4-3k3n</link>
      <guid>https://dev.to/damilare_abogunrin/exporting-csv-data-from-real-estate-website-with-bs4-3k3n</guid>
      <description>&lt;p&gt;In this article, we will explore how to scrape data from a real estate website using Beautiful Soup version 4. Specifically, we will be scraping data on rental apartments in Amsterdam from &lt;a href="http://www.pararius.com"&gt;www.pararius.com&lt;/a&gt;, one of the leading real estate websites in the Netherlands. &lt;/p&gt;

&lt;p&gt;Using BS4, we will parse the HTML content of the webpage, extract relevant data such as apartment details, pricing, and location, and export it to CSV files for further analysis. This technical guide will provide step-by-step instructions on how to set up and execute a web scraping script using Python and BS4 to obtain and export data from real estate websites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Packages
&lt;/h2&gt;

&lt;p&gt;Beautiful Soup&lt;br&gt;
Python CSV library&lt;br&gt;
pip Installer &lt;/p&gt;

&lt;h2&gt;
  
  
  Script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
from bs4 import BeautifulSoup

import requests

from csv import writer

url= "https://www.pararius.com/apartments/amsterdam?ac=1"

page = requests.get(url)

soup = BeautifulSoup(page.content, 'html.parser')

lists = soup.find_all('section', class_="listing-search-item")

with open('housing.csv', 'w', encoding='utf8', newline='') as f:

    thewriter = writer(f)

    header = ['Title', 'Location', 'Price', 'Area']

    thewriter.writerow(header)

    for list in lists:

        title = list.find('a', class_="listing-search-item__link--title").text.replace('\n', '')

        location = list.find('div', class_="listing-search-item__location").text.replace('\n', '')

        price = list.find('span', class_="listing-search-item__price").text.replace('\n', '')

        area = list.find('span', class_="illustrated-features__description").text.replace('\n', '')



        info = [title, location, price, area]

        thewriter.writerow(info)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>bs4</category>
      <category>python</category>
      <category>csv</category>
    </item>
    <item>
      <title>Scraping Data from Amazon into Google Sheets using ScraperAPI and Google Apps Script</title>
      <dc:creator>Damilare Abogunrin</dc:creator>
      <pubDate>Sat, 11 Mar 2023 23:11:52 +0000</pubDate>
      <link>https://dev.to/damilare_abogunrin/scraping-data-from-amazon-into-google-sheets-using-scraperapi-and-google-apps-script-25k9</link>
      <guid>https://dev.to/damilare_abogunrin/scraping-data-from-amazon-into-google-sheets-using-scraperapi-and-google-apps-script-25k9</guid>
      <description>&lt;h2&gt;
  
  
  Completed Project
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1JbF7ptNc6XgcEwxpoFU2RkJFKYefiPKxyglOUavbsy4/edit?usp=drivesdk"&gt;https://docs.google.com/spreadsheets/d/1JbF7ptNc6XgcEwxpoFU2RkJFKYefiPKxyglOUavbsy4/edit?usp=drivesdk&lt;/a&gt; &lt;em&gt;(Set to View Only for security reasons)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools Needed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Scraper API&lt;/li&gt;
&lt;li&gt;Google Sheets&lt;/li&gt;
&lt;li&gt;Google Apps Script&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Guide
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create or sign into your account with ScraperAPI. Head over to your dashboard and grab your ScraperAPI API key. ScraperAPI’s free plan affords you 5,000 calls for your first seven days on registration. Afterwards, yo get 1,000 calls on your free plan.&lt;/li&gt;
&lt;li&gt;Open up a new Google Sheets file. Mine’s named: Amazon Google Sheets Data.
For convenience and forward compatibility with my script, i recommend that you strucure your G-Sheets as indicated in the picture. However, you can always make adjustments to your code if you'd rather not.&lt;/li&gt;
&lt;li&gt;For clarity, our column headers are: S/N, Page ID, Product Description, Product URL, Images, Rating, Reviews, and Price. &lt;/li&gt;
&lt;li&gt;For ease of use, the search key is expected in the B2 cell.
Let's code up the script:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function mainFunction()    
//Attach this function to a trigger of sorts in your Google Sheets
{
    clearRecords();

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var tableSheet = ss.getSheetByName(‘TABLE’);
    var settingSheet = ss.getSheetByName(‘SETTINGS’);
    var searchValue = tableSheet.getRange(1,2).getValue();
    var API_KEY = xxxxx;

    var url = “http://api.scraperapi.com”;
url += “?api_key=”+api_key
url += “&amp;amp;autoparse=true”;
url += “&amp;amp;url=https://www.amazon.com/s?k=”+searchValue;

// fetch data from API
var response = UrlFetchApp.fetch(url);
var json = response.getContentText();
var data = JSON.parse(json);

var item_count = 1;

for (var i = 0; i = data.results.length; i++)
{
var results = data.results;
var name = results[i].name;
var image = results[i].image;
var list_url = results[i].url;
var stars = results[i].price;
var reviews = results[i].total_reviews;

if (stars == null)
{
    stars = 0;
}

if(reviews == null)
{
    reviews = 0;
}

addRecord(item_count, 1, name, list_url, stars, reviews, price);

item_count+
    }

    var pages = data.pagination;

    if(pages.length &amp;gt; 0)
{
    for {var x = 0; x &amp;lt; pages.length: x++)
    {
        Utilities.sleep(2000);

        var url = “http://api.scraperapi.com”;
url += “?api_key=”+api_key
url += “&amp;amp;autoparse=true”;
url += “&amp;amp;url=”+pages[x];


       function clearRecords()
       {
    var ss= SpreadsheetApp.getActiveSpreadsheet();
    var tableSheet = ss.getSheetByName(‘TABLE’);
    tableSheet.gtRange(‘A4:H1000’).clear();
       }

     function addRecord(coun, page, name, image, list_url, stars, reviews, price){
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var tableSheet = ss.getSheetByName(‘TABLE’);
    tableSheet.appendRow([count, page, name, image, list_url, stars, reviews, price]);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6 Afterwards, head over to your the sheets. Type in your search query into the designated cell. For us, that'd be Cell B2. Here's what our output looks like for a search query of 'Medieval Torces'.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>api</category>
      <category>scraping</category>
    </item>
  </channel>
</rss>
