<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Research tool on Research Tool</title>
    <link>/</link>
    <description>Recent content in Research tool on Research Tool</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>cahoover@gmail.com (Christopher Hoover)</managingEditor>
    <webMaster>cahoover@gmail.com (Christopher Hoover)</webMaster>
    <lastBuildDate>Thu, 19 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Research Tool: The Annotation Substrate</title>
      <link>/posts/the-annotation-substrate/</link>
      <pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/the-annotation-substrate/</guid>
      <description>&lt;p&gt;Most ‌people ‌hear ‌“annotation” and picture a sticky note, a little comment bubble hanging off the margin. Extra metadata you tack on afterward. The kind of feature a team adds in Sprint 14 because a customer asked for “collaboration.”&lt;/p&gt;
&lt;p&gt;We don’t treat it that way. When someone is working through dense material, legislation, regulatory filings, contracts, or even messy quantitative observations, the real value rarely sits in the raw source. It sits in the judgment and connections formed while reading it. How one amendment quietly collides with another. Whether a revised sentence is an actual policy shift or just cleanup. Why a sudden spike in a series is probably a reporting quirk, not the world changing overnight.&lt;/p&gt;</description>
      <content>&lt;p&gt;Most ‌people ‌hear ‌“annotation” and picture a sticky note, a little comment bubble hanging off the margin. Extra metadata you tack on afterward. The kind of feature a team adds in Sprint 14 because a customer asked for “collaboration.”&lt;/p&gt;
&lt;p&gt;We don’t treat it that way. When someone is working through dense material, legislation, regulatory filings, contracts, or even messy quantitative observations, the real value rarely sits in the raw source. It sits in the judgment and connections formed while reading it. How one amendment quietly collides with another. Whether a revised sentence is an actual policy shift or just cleanup. Why a sudden spike in a series is probably a reporting quirk, not the world changing overnight.&lt;/p&gt;
&lt;h2 id=&#34;the-annotation-substrate&#34;&gt;The annotation substrate&lt;/h2&gt;
&lt;p&gt;Substrate (noun): the base something lives on.&lt;/p&gt;
&lt;p&gt;At RT, we’ve been building what we call an annotation substrate, a durable layer where human and (human-verified) machine judgments are treated as first-class objects. They have an identity. They have history. They have a lifecycle. This isn’t “notes on top of content,” it’s infrastructure that makes judgment sturdy enough to become part of system behavior.&lt;/p&gt;
&lt;p&gt;For example: an analyst marks a statutory provision as ambiguous. The provision is the target. The justification might be a conflicting committee report, a related amendment, and an older analyst note that argued the opposite. Those aren’t the same kind of thing. They play different roles, so the system should represent them differently.&lt;/p&gt;
&lt;p&gt;If you squash all of that into a single “comment on this highlighted span,” you lose what makes annotations searchable, composable, and reusable.&lt;/p&gt;
&lt;p&gt;Durable annotations enable another navigation surface across the corpus, such as: show every provision marked as ambiguous; list findings that rely on this committee report; surface where analysts disagree; track what shifted after a particular amendment; pull every quantitative observation linked to this clause.&lt;/p&gt;
&lt;h2 id=&#34;what-about-structured-data&#34;&gt;What about structured data?&lt;/h2&gt;
&lt;p&gt;The same idea extends to structured data.&lt;/p&gt;
&lt;p&gt;We work with quantitative observations next to legal text, measures, time series, outcomes, analytic checkpoints, and so on. Analysts need to annotate those too: “This spike is a reporting artifact.” “This correlation stops holding after the 2019 rule change.” “This measure isn’t comparable after the statutory revision.”&lt;/p&gt;
&lt;p&gt;That means a single annotation can say: This statistical trend (structured target) -&amp;gt; is explained by this clause (document evidence) -&amp;gt; and contradicted by this prior finding (another structured target).&lt;/p&gt;
&lt;h2 id=&#34;compounding-impact&#34;&gt;Compounding impact&lt;/h2&gt;
&lt;p&gt;Annotations made over time (e.g. by a team) have compounding value for the exploration of a large corpus. You can start at a clause and jump to the metrics it might influence. Or begin with an anomaly in the numbers and move back to the governing language. You can trace where an earlier conclusion gets strengthened, weakened, or overturned as versions shift and sources change. You can disagree with annotations and track disagreements.&lt;/p&gt;
&lt;h2 id=&#34;still-early-but-the-direction-is-clear&#34;&gt;Still early, but the direction is clear&lt;/h2&gt;
&lt;p&gt;It’s early. The structured targeting layer still needs resolver APIs, selector schemas, and firmer calls around versioning. Plenty remains to be nailed down.&lt;/p&gt;
&lt;p&gt;But the path is straightforward: one substrate across modalities, durable coordinates rather than brittle offsets, explicit evidence rather than collapsed comments, and judgment you can reuse.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Why Being Interesting Isn&#39;t Enough: Emotional Triggers in Advertising</title>
      <link>/posts/building-emotional-triggers/</link>
      <pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/building-emotional-triggers/</guid>
      <description>&lt;p&gt;Imagine attending a cocktail party where you don&amp;rsquo;t know anyone. You engage in small talk, selecting topics strategically — mentioning books to appear intelligent, restaurants to seem cultured, or amusing anecdotes to be perceived as funny.&lt;/p&gt;
&lt;h2 id=&#34;advertisers-want-to-be-interesting-too&#34;&gt;Advertisers want to be interesting too&lt;/h2&gt;
&lt;p&gt;Companies invest heavily in making products stand out through creative advertising — dancing food characters, sedans in car chases, and high-budget campaigns. While this approach can work, a product doesn&amp;rsquo;t have to seem interesting for a campaign to be effective.&lt;/p&gt;</description>
      <content>&lt;p&gt;Imagine attending a cocktail party where you don&amp;rsquo;t know anyone. You engage in small talk, selecting topics strategically — mentioning books to appear intelligent, restaurants to seem cultured, or amusing anecdotes to be perceived as funny.&lt;/p&gt;
&lt;h2 id=&#34;advertisers-want-to-be-interesting-too&#34;&gt;Advertisers want to be interesting too&lt;/h2&gt;
&lt;p&gt;Companies invest heavily in making products stand out through creative advertising — dancing food characters, sedans in car chases, and high-budget campaigns. While this approach can work, a product doesn&amp;rsquo;t have to seem interesting for a campaign to be effective.&lt;/p&gt;
&lt;h2 id=&#34;correlating-impact-advertising-with-effectiveness&#34;&gt;Correlating impact advertising with effectiveness&lt;/h2&gt;
&lt;p&gt;Wharton professor Jonah Berger studied whether interesting product positioning correlates with campaign success. Working with word-of-mouth marketing firms, he measured consumer engagement across hundreds of products. His findings: he found no correlation. Interesting products didn&amp;rsquo;t receive any more word of mouth than everyday products.&lt;/p&gt;
&lt;p&gt;Novelty showed the same result — no correlation with word-of-mouth engagement, regardless of demographic differences.&lt;/p&gt;
&lt;h2 id=&#34;context-in-advertising&#34;&gt;Context in advertising&lt;/h2&gt;
&lt;p&gt;Berger discovered two distinct campaign styles: &amp;ldquo;impact&amp;rdquo; advertising, which emphasizes unique qualities, and trigger-based campaigns, which associate products with specific contexts like activities or circumstances.&lt;/p&gt;
&lt;h2 id=&#34;context-is-everything&#34;&gt;Context is everything&lt;/h2&gt;
&lt;p&gt;Research demonstrates context&amp;rsquo;s powerful influence on behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Music genre affecting wine sales in stores&lt;/li&gt;
&lt;li&gt;Increased space-themed product sales during Mars missions&lt;/li&gt;
&lt;li&gt;Vote location (schools) influencing education initiative support&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;marketing-to-context&#34;&gt;Marketing to context&lt;/h2&gt;
&lt;p&gt;Trigger campaigns build associations between emotional contexts and products over time. Three successful examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Corona&lt;/strong&gt; linked beach relaxation to beer (8% market share growth)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kit Kat&lt;/strong&gt; connected coffee breaks to chocolate bars (5% growth)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kodak&lt;/strong&gt; created the &amp;ldquo;Kodak moment&amp;rdquo; for family gatherings&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;three-things-that-matter-most-for-triggers&#34;&gt;Three things that matter most for triggers&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Frequency:&lt;/strong&gt; Triggers must occur regularly. Michelob&amp;rsquo;s holiday campaign underperformed until reframed as &amp;ldquo;Weekends were made for Michelob.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strength:&lt;/strong&gt; Ubiquitous or competing triggers dilute effectiveness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context:&lt;/strong&gt; Triggers aligned with desired behavior outperform mismatched associations. A pediatrician&amp;rsquo;s office better suits immunization promotions than grocery carts.&lt;/p&gt;
&lt;p&gt;For deeper research insights, explore Jonah Berger&amp;rsquo;s book &lt;em&gt;Contagious: Why Things Catch On&lt;/em&gt;.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>People follow &#39;expert&#39; advice, even if it&#39;s bad</title>
      <link>/posts/your-brain-on-expert-advice/</link>
      <pubDate>Mon, 26 Jan 2026 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/your-brain-on-expert-advice/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Our brains tend to shut down and blindly follow expert advice, even when the advice is bad.&lt;/p&gt;
&lt;p&gt;A 2009 study published in the journal PLoS ONE provides interesting insights into how our brains react to so-called &amp;ldquo;expert&amp;rdquo; financial advice. The research, conducted by a team of neuroscientists and economists, used brain imaging techniques to peer inside people&amp;rsquo;s heads as they made financial decisions involving risk and uncertainty. In some cases, the participants had to rely on their own judgment. But in other trials, they were advised by a financial expert about what choice to make.&lt;/p&gt;</description>
      <content>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Our brains tend to shut down and blindly follow expert advice, even when the advice is bad.&lt;/p&gt;
&lt;p&gt;A 2009 study published in the journal PLoS ONE provides interesting insights into how our brains react to so-called &amp;ldquo;expert&amp;rdquo; financial advice. The research, conducted by a team of neuroscientists and economists, used brain imaging techniques to peer inside people&amp;rsquo;s heads as they made financial decisions involving risk and uncertainty. In some cases, the participants had to rely on their own judgment. But in other trials, they were advised by a financial expert about what choice to make.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a link to the research: &lt;a href=&#34;https://pubmed.ncbi.nlm.nih.gov/19308261/?ref=cahoover.com&#34;&gt;Expert financial advice neurobiologically &amp;ldquo;Offloads&amp;rdquo; financial decision-making&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;people-tend-to-blindly-follow-experts&#34;&gt;People tend to blindly follow experts&lt;/h2&gt;
&lt;p&gt;The result: When left to think for themselves, participant&amp;rsquo;s brains lit up in areas known to be involved in calculating value and weighing risks and rewards. But when expert advice was provided, these valuation regions went dark. Instead, the brain defaulted to areas involved in social cognition and theory of mind - in trying to figure out what the expert was thinking.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The presence of expert advice caused the participants to shut down their own independent value calculations and instead focus on uncritically following the expert opinion.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Essentially, the presence of expert advice caused the participants to shut down their own independent value calculations and instead focus on uncritically following the expert opinion. As the study authors put it, the expert advice &amp;ldquo;offloaded&amp;rdquo; the burden of financial decision-making from the individual&amp;rsquo;s brain.&lt;/p&gt;
&lt;p&gt;The implication is that people may be prone to blindly follow expert advice without engaging in any rational analysis of their own. The normal brain mechanisms for evaluating risks, rewards, and probabilities get bypassed. We switch from objective valuation to trying to get inside the expert&amp;rsquo;s head.&lt;/p&gt;
&lt;h2 id=&#34;ignoring-expert-advice-is-stressful-even-if-its-wrong&#34;&gt;Ignoring expert advice is stressful, even if it&amp;rsquo;s wrong&lt;/h2&gt;
&lt;p&gt;What happens if the expert&amp;rsquo;s advice is suboptimal or just plain wrong? The study found that regions involved in negative emotional arousal activated when people went against the expert&amp;rsquo;s advice. Rejecting an expert opinion appears to be stressful, unnatural, and aversive at a neural level. Our brains are wired to follow the experts.&lt;/p&gt;
&lt;p&gt;There are dangers to this instinct to conform to expert advice. While experts in finance and other fields certainly have valuable knowledge to impart, they can also make mistakes and have biases or ulterior motives. Blindly adhering to expert opinion deprives us of the ability to think critically and form our own judgments. And if an expert&amp;rsquo;s advice is flawed, it could lead to harmful decisions, both at an individual and societal level, if followed en masse.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Building a decent team: traits to look for in candidates</title>
      <link>/posts/building-the-ideal-team/</link>
      <pubDate>Fri, 19 Dec 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/building-the-ideal-team/</guid>
      <description>&lt;p&gt;I learned how to hire the same way I&amp;rsquo;ve learned to do pretty much everything in my life: I started with absolutely no idea what I was doing, and failed and fumbled my way to something approaching competence.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I&amp;rsquo;ve learned to look for in candidates, no matter the role:&lt;/p&gt;
&lt;h2 id=&#34;rule-1-dont-hire-assholes&#34;&gt;Rule 1: Don&amp;rsquo;t Hire Assholes&lt;/h2&gt;
&lt;p&gt;It baffles me how often companies put up with assholes. To me, you can&amp;rsquo;t be smart enough, or curious enough, or contentious enough to make up for being an asshole.&lt;/p&gt;</description>
      <content>&lt;p&gt;I learned how to hire the same way I&amp;rsquo;ve learned to do pretty much everything in my life: I started with absolutely no idea what I was doing, and failed and fumbled my way to something approaching competence.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I&amp;rsquo;ve learned to look for in candidates, no matter the role:&lt;/p&gt;
&lt;h2 id=&#34;rule-1-dont-hire-assholes&#34;&gt;Rule 1: Don&amp;rsquo;t Hire Assholes&lt;/h2&gt;
&lt;p&gt;It baffles me how often companies put up with assholes. To me, you can&amp;rsquo;t be smart enough, or curious enough, or contentious enough to make up for being an asshole.&lt;/p&gt;
&lt;p&gt;In the excellent &amp;ldquo;No Asshole Rule,&amp;rdquo; Robert Sutton explores the negative impacts toxic people can have on the workplace:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Negative Impact on Team Morale&lt;/strong&gt;: Disrespectful or aggressive behavior can demoralize other team members, leading to a decline in overall morale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduced Collaboration and Creativity&lt;/strong&gt;: In environments where people feel threatened or belittled, collaboration and creativity often suffer. Since marketing relies heavily on teamwork and creative thinking, such negative behaviors can be particularly damaging.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Increased Turnover&lt;/strong&gt;: Teams with toxic members experience higher turnover rates. The cost of recruiting, hiring, and training new employees is high, not to mention the loss of institutional knowledge and network connections.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lower Productivity&lt;/strong&gt;: Negative behaviors can lead to increased stress and anxiety among team members, which often results in lower productivity and a decline in the quality of work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Legal and HR Issues&lt;/strong&gt;: No one wants to spend time and resources on HR interventions and legal matters.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;rule-2-hire-all-the-smart-people&#34;&gt;Rule 2: Hire all the smart people&lt;/h2&gt;
&lt;p&gt;Borrowing from Ken Norton&amp;rsquo;s classic essay, hire smart people. This is the number one rule I follow when hiring for any role. Ken writes, &amp;ldquo;I&amp;rsquo;ll take a wickedly smart, inexperienced person over one of average intellect and years of experience any day.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;(Obviously there is a caveat to this, which is that for some roles there&amp;rsquo;s no getting around training and experience. No matter how &amp;ldquo;wickedly&amp;rdquo; smart a person is, you don&amp;rsquo;t want an inexperienced person performing surgery, or flying a plane, or leading a team.)&lt;/p&gt;
&lt;p&gt;The rule to hire smart people is backed by research. Frank Schmidt and John Hunter conducted meta-analytic studies that analyzed decades of research on employee selection methods and what they found was that General Mental Ability (GMA), or cognitive ability, is consistently one of the best single predictors of job performance, especially for more complex jobs.&lt;/p&gt;
&lt;h2 id=&#34;rule-3-hire-curious-people&#34;&gt;Rule 3: Hire Curious People&lt;/h2&gt;
&lt;p&gt;For a while I figured that hiring smart people meant you automatically got curious people as well. But this isn&amp;rsquo;t true: being smart doesn&amp;rsquo;t automatically mean you&amp;rsquo;re curious. Curiosity is about a person&amp;rsquo;s inclination to seek new experiences, knowledge, and understanding. Smart people have the capacity to learn and understand, but they might not have the desire or motivation to seek out new information or experiences.&lt;/p&gt;
&lt;p&gt;This rule is also backed by research. Dr. Patrick Mussel, a professor in the Personality Psychology and Psychological Assessment division of the Freie Universität in Berlin found that curiosity, defined as &amp;ldquo;a desire to acquire new knowledge and experiences,&amp;rdquo; significantly influences job performance. Curiosity predicts enhanced learning, adaptability, problem-solving skills, creativity, and overall job performance.&lt;/p&gt;
&lt;h2 id=&#34;rule-4-hire-conscientious-people&#34;&gt;Rule 4: Hire Conscientious People&lt;/h2&gt;
&lt;p&gt;Conscientiousness is a personality trait described in the &amp;ldquo;Big Five&amp;rdquo; model, which proposes that there are five major dimensions of personality, each representing a range between two extremes (the other four are Openness to Experience, Extraversion, Agreeableness, and Neuroticism).&lt;/p&gt;
&lt;p&gt;In my opinion high Conscientiousness is important for any role, but was especially important to inside sales. SDRs have to track of hundreds of outbound communications, create and manage A/B tests for their messages, ensure the right message is being used for particular personas, reporting results, responding quickly to inbound signals, and a hundred other things.&lt;/p&gt;
&lt;p&gt;The qualities of a highly conscientious person:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Responsibility and Reliability&lt;/strong&gt;: They are often very reliable and take their commitments seriously. High conscientiousness is associated with a strong sense of duty, responsibility, and dependability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Organization and Attention to Detail&lt;/strong&gt;: Such individuals tend to be well-organized and mindful of details. They are good at planning, scheduling, and ensuring that tasks are completed thoroughly and efficiently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discipline and Self-Control&lt;/strong&gt;: High conscientiousness is linked to strong self-discipline and the ability to regulate and control impulses. People with this trait often exhibit a strong work ethic and the ability to persist in challenging tasks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Goal-Oriented and Achievement-Focused&lt;/strong&gt;: They are usually driven and determined to achieve their goals. This often translates into a proactive approach to work and personal projects, with a focus on setting and accomplishing objectives.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perseverance&lt;/strong&gt;: They often show a high level of perseverance, especially in the face of obstacles or difficulties, and are less likely to give up when faced with challenges.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;rsquo;s relatively easy to have rules for hiring; identifying candidates that fit the rules is something else entirely. I&amp;rsquo;ll outline some thoughts on that next.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>The larger the team, the less productive each individual becomes</title>
      <link>/posts/hidden-challenge-teamwork/</link>
      <pubDate>Fri, 12 Dec 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/hidden-challenge-teamwork/</guid>
      <description>&lt;p&gt;Managing people can be rewarding. It can also be an absolute pain in the neck.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s messy, for one thing. People get into spats. Or they get into romantic entanglements that inevitably lead to spats. They get too drunk at the Christmas party. They complain and argue and are passive-aggressive. Or aggressive-aggressive.&lt;/p&gt;
&lt;p&gt;These issues are tiresome, but they&amp;rsquo;re not the real challenge. The challenge is productivity. Getting teams to maintain a strong pace and achieve consistent quality is hard. I struggle constantly with it.&lt;/p&gt;</description>
      <content>&lt;p&gt;Managing people can be rewarding. It can also be an absolute pain in the neck.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s messy, for one thing. People get into spats. Or they get into romantic entanglements that inevitably lead to spats. They get too drunk at the Christmas party. They complain and argue and are passive-aggressive. Or aggressive-aggressive.&lt;/p&gt;
&lt;p&gt;These issues are tiresome, but they&amp;rsquo;re not the real challenge. The challenge is productivity. Getting teams to maintain a strong pace and achieve consistent quality is hard. I struggle constantly with it.&lt;/p&gt;
&lt;p&gt;The nagging voice in my head assures me this is proof I&amp;rsquo;m a crap manager. I wouldn&amp;rsquo;t say I like that voice, but it&amp;rsquo;s motivating. It keeps me focused and engaged, and I am forever looking to improve. But the struggle is always there.&lt;/p&gt;
&lt;p&gt;If you struggle like this as well, take heart. Lower productivity is a natural consequence of teams. The challenge is built in and largely unavoidable. The nagging voice may still be there, but it&amp;rsquo;s wrong.&lt;/p&gt;
&lt;h2 id=&#34;people-slack-off-if-theyre-in-a-group&#34;&gt;People slack off if they&amp;rsquo;re in a group&lt;/h2&gt;
&lt;p&gt;This story starts, as so many great stories do, in France just before the First World War.&lt;/p&gt;
&lt;p&gt;In 1913, a man named Eugene Tisserand worked in the French Ministry of Agriculture. Tisserand&amp;rsquo;s job was to look for ways to improve farm production, and he traveled all over France, visiting farms and talking to farmers. As he travels, he observes that most farming equipment is poorly designed and constructed by the farmers themselves.&lt;/p&gt;
&lt;p&gt;Tisserand figures that a scientific approach might help improve production, so he commissions a Parisian professor named Maximilian Ringelmann to study farming processes and to establish best practices.&lt;/p&gt;
&lt;p&gt;Ringelmann sets to work measuring the efficiency of farm equipment and the horses that drove them. Along the way, he discovers something odd. Two horses working together didn&amp;rsquo;t do twice the work of a single horse. Adding more horses decreased each horse&amp;rsquo;s contribution even further.&lt;/p&gt;
&lt;p&gt;Ringelmann wondered if the same thing happened with people. To test it, he brought a group of students over to the farm lab. He asked them, individually and in groups, to pull a rope attached to a force meter. When two people pull together, they each apply about 90% of the effort than when they pull individually. If three people pull together, each contributes about 85% of their individual effort. And when eight people pull together, each applied only about 49%!&lt;/p&gt;
&lt;p&gt;This is the Ringelmann effect, sometimes known more colloquially as &amp;ldquo;social loafing.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;why-people-slack-off&#34;&gt;Why people slack off&lt;/h2&gt;
&lt;p&gt;Since Ringelmann&amp;rsquo;s experiment, researchers have found the phenomenon in countless contexts. Swimmers competing in a relay race put in significantly less effort if they thought their individual times were not being measured. The same story goes for rowers, whose efforts systematically (and unconsciously) decrease as team size increases. Students working together on a joint project will each contribute less effort.&lt;/p&gt;
&lt;p&gt;Unsurprisingly, the Ringelmann effect also occurs at work. Dozens of studies have shown that individuals reduce their effort when they are part of a workgroup. Team members contribute less frequently and with lower quality than when acting alone. This is true with any team at any level in the organization, including the board of directors, the executive team, or a clutch of interns. The transition to remote work has only amplified the effect.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Dozens of studies have shown that individuals reduce their effort when they are part of a workgroup.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Studies have also looked into why slacking occurs. There are many reasons, and a single team can have one or many of them:&lt;/p&gt;
&lt;h3 id=&#34;workgroup-cohesion&#34;&gt;Workgroup cohesion&lt;/h3&gt;
&lt;p&gt;Tight-knit teams foster a sense of loyalty and responsibility among members. Teams that lack interpersonal &amp;ldquo;chemistry&amp;rdquo; are less productive because it reduces the consequences of slacking — there&amp;rsquo;s little fear that by slacking you&amp;rsquo;re dropping the ball on a friend. Obviously, remote work makes building and maintaining team cohesion even more challenging.&lt;/p&gt;
&lt;h3 id=&#34;dispensability-of-effort&#34;&gt;Dispensability of effort&lt;/h3&gt;
&lt;p&gt;Sometimes, people feel intimidated or incompetent relative to other team members. There is a perceived risk of humiliation through contribution and a feeling that the team will complete its task at some minimal satisfactory level even without one&amp;rsquo;s contributions.&lt;/p&gt;
&lt;h3 id=&#34;futility-of-effort&#34;&gt;Futility of effort&lt;/h3&gt;
&lt;p&gt;The opposite side of the coin from dispensability of effort, feelings of futility cause a person to believe that the team&amp;rsquo;s mission will fail regardless of their contribution. Regardless of the extent or caliber of their contribution, the team will fail to meet its goal.&lt;/p&gt;
&lt;h3 id=&#34;lack-of-recognition&#34;&gt;Lack of recognition&lt;/h3&gt;
&lt;p&gt;Individuals might feel that their supervisors can&amp;rsquo;t (or won&amp;rsquo;t) distinguish their work from contributions made by other team members. If there&amp;rsquo;s little visibility into an individual&amp;rsquo;s contribution, that person believes they will experience the same consequence whether they work hard or not. Given the choice, most people will opt for the latter and instead focus their efforts on more personally beneficial activities.&lt;/p&gt;
&lt;h3 id=&#34;unbalanced-effort&#34;&gt;Unbalanced effort&lt;/h3&gt;
&lt;p&gt;If a person believes that other team members are contributing less, they may reduce their effort to better mirror the contribution made by others. In a remote setting, unbalanced effort becomes more pronounced, with some team members feeling they are contributing more due to the lack of visibility into everyone&amp;rsquo;s workloads, further complicating the dynamics of effort and contribution.&lt;/p&gt;
&lt;h3 id=&#34;unfairness&#34;&gt;Unfairness&lt;/h3&gt;
&lt;p&gt;There is a strong relationship between productivity and the sense that a team&amp;rsquo;s procedures and processes are equitable among all members. If certain team members are perceived as favored, others will likely decrease their contributions to the team.&lt;/p&gt;
&lt;h3 id=&#34;workgroup-size&#34;&gt;Workgroup size&lt;/h3&gt;
&lt;p&gt;Team size is the magnifier of all other effects of all the variables described above. As a group grows larger, it&amp;rsquo;s more difficult to distinguish and assess individual contributions. This increases the likelihood that individual members will feel anonymous and decrease their efforts accordingly.&lt;/p&gt;
&lt;p&gt;All of these reasons are dynamic and recursive. For example, if a team member reduces their effort for any reason (say because they think the team is unfair), others will tend to react to this by likewise reducing their efforts, causing still others in the team to react, and so on.&lt;/p&gt;
&lt;p&gt;This dynamic plays out at home, too. If one partner believes the other is better at housework, they may believe their effort is dispensable and reduce their effort toward maintaining the house. The other partner, meantime, begins to feel their effort is futile and likewise reduces housekeeping activities.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;The effectiveness of any group tends to decline over time, with each member putting in the least effort required.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;some-strategies&#34;&gt;Some strategies&lt;/h2&gt;
&lt;p&gt;The (sort of) good news is that there are methods for limiting slacking on teams. The bad news is that it&amp;rsquo;s not easy — they all involve careful planning and ongoing engagement on the part of the manager.&lt;/p&gt;
&lt;h3 id=&#34;compose-groups-with-different-skill-sets&#34;&gt;Compose groups with different skill sets&lt;/h3&gt;
&lt;p&gt;This ensures each member feels their contribution is unique and essential to the team&amp;rsquo;s success. When forming teams, highlight each person&amp;rsquo;s strengths to reinforce their sense of value. This approach also helps broaden employees&amp;rsquo; abilities by exposing them to new skills.&lt;/p&gt;
&lt;h3 id=&#34;limit-group-size&#34;&gt;Limit group size&lt;/h3&gt;
&lt;p&gt;Teams become unwieldy to manage after a certain size, and become less and less productive anyway. The group should be large enough to accommodate members of various necessary skill sets, but not much larger.&lt;/p&gt;
&lt;h3 id=&#34;clarify-goals-and-objectives&#34;&gt;Clarify goals and objectives&lt;/h3&gt;
&lt;p&gt;Teams need to feel that they understand what they are trying to accomplish, that the mission matters, and that it is achievable. Managers should work hard to clarify overall OKRs as well as those for each member.&lt;/p&gt;
&lt;h3 id=&#34;give-groups-discretion-over-planning-and-executing-work&#34;&gt;Give groups discretion over planning and executing work&lt;/h3&gt;
&lt;p&gt;Ownership increases engagement, so set overall vision and objectives and allow the team to work out how to get there. Some managers will tell the team to figure out the details and then ignore the team until it&amp;rsquo;s time for the final delivery. Don&amp;rsquo;t do that. Have the team present the strategy, ensure it is measurable and realistic, and stay engaged.&lt;/p&gt;
&lt;h3 id=&#34;measure-and-stay-engaged&#34;&gt;Measure and stay engaged&lt;/h3&gt;
&lt;p&gt;Set clear expectations for each team member and track progress through regular one-on-one meetings. This ensures everyone feels recognized, allows you to address potential problems proactively, and ultimately prevents issues from escalating.&lt;/p&gt;
&lt;h3 id=&#34;beware-geographic-distribution&#34;&gt;Beware geographic distribution&lt;/h3&gt;
&lt;p&gt;Remote work is a fact of the modern workplace, but it can contribute to lower productivity because it can be harder to maintain group cohesion. When building geographically distributed groups, you need to double down efforts to foster communication and engagement.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>B2B customers aren&#39;t rational</title>
      <link>/posts/four-ideas-to-improve-b2b-marketing/</link>
      <pubDate>Fri, 21 Nov 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/four-ideas-to-improve-b2b-marketing/</guid>
      <description>&lt;p&gt;The CMO council determined that most B2B marketing efforts are largely ineffective. Buyers and influencers characterize marketing as &amp;ldquo;self-serving, irrelevant, hyperbolic, and hyper-technical,&amp;rdquo; lacking the &amp;ldquo;depth, objectivity and strategic context&amp;rdquo; they need.&lt;/p&gt;
&lt;h2 id=&#34;research-foundation&#34;&gt;Research Foundation&lt;/h2&gt;
&lt;p&gt;In 1974, Purdue professor Jacob Jacoby studied how consumers process product label information. His finding was counterintuitive: increased packaging information actually decreased consumers&amp;rsquo; likelihood of selecting products matching their initial preferences. This challenged the assumption that more information improves decision-making.&lt;/p&gt;</description>
      <content>&lt;p&gt;The CMO council determined that most B2B marketing efforts are largely ineffective. Buyers and influencers characterize marketing as &amp;ldquo;self-serving, irrelevant, hyperbolic, and hyper-technical,&amp;rdquo; lacking the &amp;ldquo;depth, objectivity and strategic context&amp;rdquo; they need.&lt;/p&gt;
&lt;h2 id=&#34;research-foundation&#34;&gt;Research Foundation&lt;/h2&gt;
&lt;p&gt;In 1974, Purdue professor Jacob Jacoby studied how consumers process product label information. His finding was counterintuitive: increased packaging information actually decreased consumers&amp;rsquo; likelihood of selecting products matching their initial preferences. This challenged the assumption that more information improves decision-making.&lt;/p&gt;
&lt;h2 id=&#34;the-rational-choice-theory-problem&#34;&gt;The Rational Choice Theory Problem&lt;/h2&gt;
&lt;p&gt;Traditional marketing relies on rational choice theory—the idea that people have clear preferences and make impartial decisions. However, this approach proved ineffective in practice. Marketers often overwhelm customers with technical details, sometimes even deflecting value propositions back to buyers: &amp;ldquo;What do you want it to do?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;A 2003 CEB/Motista study revealed that 86% of surveyed respondents saw &amp;ldquo;no&amp;rdquo; meaningful difference between top vendors, despite functional capability variations.&lt;/p&gt;
&lt;h2 id=&#34;decision-making-reality&#34;&gt;Decision-Making Reality&lt;/h2&gt;
&lt;p&gt;Research demonstrates that group opinion and risk aversion heavily influence purchasing decisions. People avoid recommending vendors that might damage their professional reputation.&lt;/p&gt;
&lt;h2 id=&#34;recommended-strategies&#34;&gt;Recommended Strategies&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Specialize:&lt;/strong&gt; Focus on specific target markets rather than diluting messaging across multiple segments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Foster emotional safety:&lt;/strong&gt; Build relationships with industry analysts and thought leaders; referrals provide social proof and reassurance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Foster trust:&lt;/strong&gt; Learn about customer goals and create targeted material connecting products to specific needs through unexpected insights.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reduce cognitive load:&lt;/strong&gt; Develop clear value propositions rather than expecting customers to intuit solutions independently.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>It&#39;s surprisingly easy to kill a promising business.</title>
      <link>/posts/the-tyranny-of-success-why-start-ups-flounder-after-huge-early-market-wins/</link>
      <pubDate>Fri, 31 Oct 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/the-tyranny-of-success-why-start-ups-flounder-after-huge-early-market-wins/</guid>
      <description>&lt;p&gt;To nurture early wins into mainstream success, a company (usually) needs to pick a market and then pour energy and effort into dominating that market. A cliche, sure. But also true.&lt;/p&gt;
&lt;p&gt;Like the need to get regular exercise, this is something everyone knows but almost nobody does. The reason why is something that puzzles even business guru Geoffrey Moore: &amp;ldquo;Why so hard? I don&amp;rsquo;t know, but nobody seems to do it very well.&amp;rdquo;&lt;/p&gt;</description>
      <content>&lt;p&gt;To nurture early wins into mainstream success, a company (usually) needs to pick a market and then pour energy and effort into dominating that market. A cliche, sure. But also true.&lt;/p&gt;
&lt;p&gt;Like the need to get regular exercise, this is something everyone knows but almost nobody does. The reason why is something that puzzles even business guru Geoffrey Moore: &amp;ldquo;Why so hard? I don&amp;rsquo;t know, but nobody seems to do it very well.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;One reason it&amp;rsquo;s hard is something called the tyranny of choice. If you haven&amp;rsquo;t heard of it, you&amp;rsquo;ve almost certainly experienced it.&lt;/p&gt;
&lt;h2 id=&#34;the-tyranny-of-choice&#34;&gt;The tyranny of choice&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a paradox for you: Citizens in affluent countries have more options and live healthier lives than anyone in history. They have every reason to be happy. But they aren&amp;rsquo;t. Robert Lane of Yale University found that increased abundance is correlated with decreased happiness overall.&lt;/p&gt;
&lt;p&gt;Researcher Barry Schwartz describes why. He points out that when we shop for a car, or choose a movie to rent, or select from a restaurant menu, we&amp;rsquo;re also choosing &lt;em&gt;against&lt;/em&gt; something. Multiple somethings, in fact. With every decision, we reject the aggregate positive qualities of the alternative choices.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With every decision, we reject the aggregate positive qualities of the alternative choices.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This rejection is lost opportunity, and that loss is painful. In fact, studies by Amos Tversky and Daniel Kahneman (and many subsequent) show that we feel the pain of loss much more acutely than we do the pleasure from gain.&lt;/p&gt;
&lt;p&gt;The aversion to loss has been exploited by marketers for years. Amazon.com relies on it when the site notes there is &amp;ldquo;only two copies left&amp;rdquo; of a particular book. Similar when an infomercial urges viewers to &amp;ldquo;call within the next 10 minutes for a special bonus.&amp;rdquo; The anxiety of loss makes a purchase decision more likely.&lt;/p&gt;
&lt;p&gt;To add insult to injury, the feeling of loss grows over time because we adapt to the positive qualities of the choice we make. We get used to stuff. That great new Mercedes becomes more mundane every day. In the meantime, the aggregate positive qualities of the rejected cars remain painful. We notice BMWs on the road. Regret sets in.&lt;/p&gt;
&lt;p&gt;Schwartz writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;The consequences of unlimited choice may go far beyond mild disappointment, to suffering. [&amp;hellip;] when we make decisions and find that they do not live up to expectations, we blame ourselves.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This situation can hurt our quality of life. It can hurt business as well, especially a business looking to grow into a mainstream market.&lt;/p&gt;
&lt;h2 id=&#34;start-ups-moving-into-growth-stage-need-to-make-a-difficult-choice&#34;&gt;Start ups moving into growth stage need to make a difficult choice&lt;/h2&gt;
&lt;p&gt;In the early stages of the technology adoption life cycle, all sorts of innovators and early adopters from all sorts of different market segments seek out innovative products. Companies with early stage success have made inroads into multiple market segments.&lt;/p&gt;
&lt;p&gt;Early market success positions a company for the next phase of growth. It drives investment in the company, attracts high quality talent, and creates an energized work environment full of committed people.&lt;/p&gt;
&lt;p&gt;The next step is to grow into the mainstream. To do that, a company first selects a market segment on which to focus all its energy.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t, everything gets harder. Sales gets harder because the value proposition is dilute across multiple markets. Support is harder because they need to build a knowledge base that spans multiple markets. Product management is harder because they are asked to accommodate conflicting priorities. And so on.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t any great secret. But it&amp;rsquo;s one thing to know that it&amp;rsquo;s important to do something, and another thing entirely to actually do it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Organizations faced with choice can freeze with indecision&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Organizations faced with this choice can freeze with indecision, and avoid commitment to any one market segment. This happens for two reasons. First, loss aversion is magnified within an organization. Second, regret is magnified because we hear criticism as insightful and wise.&lt;/p&gt;
&lt;h2 id=&#34;loss-aversion-is-magnified-within-an-organization&#34;&gt;Loss aversion is magnified within an organization&lt;/h2&gt;
&lt;p&gt;Making decisions in day to day life can be tough, but the stakes are relatively low. In business the stakes are high. Choose the wrong market and the consequences can impact the equity of the company as well as the livelihood of the employees.&lt;/p&gt;
&lt;p&gt;To grow beyond the early markets into the mainstream market, a company has to choose which market segment to focus on. More to the point, the company has to choose which market segments to &lt;em&gt;ignore&lt;/em&gt;. There&amp;rsquo;s the rub.&lt;/p&gt;
&lt;p&gt;The dynamics around the tyranny of choice play very strongly here. Loss aversion is felt by many stakeholders throughout the company, and that feeling is focused and projected onto the CEO.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A sales team will have relationships across many markets and will push back if any market gets excluded from focus. They will argue for the huge revenue associated with a particular market, and will darkly mumble about a decision to focus elsewhere;&lt;/li&gt;
&lt;li&gt;A board will feel the weight of market opportunities not pursued and may contribute a lot of pressure to explain why money is being left on the table;&lt;/li&gt;
&lt;li&gt;An engineering team and product management team will have pet features that apply to various different markets. They will grumble darkly about a decision to focus elsewhere.&lt;/li&gt;
&lt;li&gt;A marketing team will have worked to build pipeline and train sales across various different markets. They will grumble darkly about a decision to focus elsewhere.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All together this combines into a loud voice saying &amp;ldquo;I can&amp;rsquo;t believe you are IGNORING this huge opportunity! What is wrong with you?!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This is one of the times being a leader becomes hard. We second guess ourselves, and even fear for our job. It&amp;rsquo;s why so many companies fail to choose and focus on a market segment. The opportunity cost of the ignored markets seems too high.&lt;/p&gt;
&lt;p&gt;Not helping matters any, the darkly grumbling critics seem very wise and insightful.&lt;/p&gt;
&lt;h2 id=&#34;critics-seem-wise-and-insightful-even-when-they-arent&#34;&gt;Critics seem wise and insightful, even when they aren&amp;rsquo;t&lt;/h2&gt;
&lt;p&gt;Organizations are full of people eager to predict that a plan will fail. Take any proposal, in any context, and inevitably someone will turn up saying the idea is unworkable, untenable, ill conceived.&lt;/p&gt;
&lt;p&gt;Stanford professors Jeffery Pfeffer and Robert Sutton sum it up nicely:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;People in many organizations are remarkably skilled at making excuses about why something can&amp;rsquo;t be done, why something won&amp;rsquo;t work&amp;hellip;These are dangerous people.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The really nasty bit is that we are hardwired to think that pessimistic people make a lot of sense.&lt;/p&gt;
&lt;p&gt;Research by Harvard professor Teresa Amabile found that pessimistic views are seen as more intelligent, competent and expert than optimistic ones. This was true even when the content of the optimism is higher quality and more forceful. She summarized that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;&amp;hellip;only pessimism sounds profound. Optimism sounds superficial.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Like the feeling of loss aversion, the impact of the nattering nabobs of negativity is magnified within an organization. Important stakeholders will feel the pessimistic view is more intelligent, and will begin to echo it.&lt;/p&gt;
&lt;p&gt;Second guessing sets in, and the organization is even more likely to freeze with indecision.&lt;/p&gt;
&lt;h2 id=&#34;some-suggestions&#34;&gt;Some suggestions&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s no silver bullet. There&amp;rsquo;s no avoiding that toughness of the situation. But there are some things we can do to make it easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Commit.&lt;/strong&gt; Recognize that the stakes are high and the consequences of choosing poorly are high. Commit to making a choice anyway because the alternative is much riskier. Write down what you want to accomplish and why; the act of writing will help clarify your mind. Identify a date by which you will make a decision, and work backward from that date to create an agenda. Make a list of all the stakeholders that need to understand what you are doing, and set up meetings with them to go over the plan and the schedule.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get clear on the process.&lt;/strong&gt; Geoffrey Moore&amp;rsquo;s process for choosing a market segment is tested and well documented:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identify the team that will help you do this. A good mix includes sales, marketing, product management, UX, and engineering.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t make the team much bigger than a half dozen.&lt;/li&gt;
&lt;li&gt;With your team, build a list of market segments to evaluate. A market segment consists of customers that have common needs and that reference one another during buying decisions. A software developer in embedded systems is not in the same market as a software developer in video games because they are unlikely to travel in the same communication circles.&lt;/li&gt;
&lt;li&gt;Have each member of the team rank each segment from 1 (worst) to 5 (best) against the following criteria: identifiable customer who will buy our product, compelling need to solve a problem we can address, can we deliver a complete product to the customer, has the problem been addressed by a competitor?&lt;/li&gt;
&lt;li&gt;Roll up all the scores and eliminate any segments that have a 1 or 2 in any category.&lt;/li&gt;
&lt;li&gt;Re-evaluate the remaining segments against the following criteria: do we have partners and allies that will help with the segment, do we have a channel in place, does our pricing make sense, are we credible in the market, does the segment have strong adjacent segments to move into?&lt;/li&gt;
&lt;li&gt;Rank order the segments by score. Commit to one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Insist that criticism be productive.&lt;/strong&gt; It&amp;rsquo;s a good practice to establish ground rules in your organization about criticism. Insist that criticism be couched as a problem to be solved, and that a possible solution be proposed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Default to action.&lt;/strong&gt; Selecting a market segment to go after is only the first step. It&amp;rsquo;s remarkably common for an organization to make a decision and then consider the action complete. Such organizations can develop two distinct dimensions &amp;ndash; the one that is presented, discussed and debated in meetings, and the one that is actually executed in the field.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>5 Steps for Choosing the Right Growth Strategy</title>
      <link>/posts/choosing-growth-strategy/</link>
      <pubDate>Fri, 26 Sep 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/choosing-growth-strategy/</guid>
      <description>&lt;p&gt;The Ansoff Matrix provides a framework for determining the best approach based on your company&amp;rsquo;s current offerings and target market. Here&amp;rsquo;s how to use it.&lt;/p&gt;
&lt;p&gt;This standard operating procedure (SOP) outlines the steps for identifying and implementing your organization&amp;rsquo;s most suitable growth strategy.&lt;/p&gt;
&lt;h2 id=&#34;step-1-assess-your-current-position&#34;&gt;Step 1: Assess Your Current Position&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Evaluate your current products or services and their performance in the market.&lt;/li&gt;
&lt;li&gt;Identify your existing customer segments and their characteristics.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;step-2-determine-your-growth-objectives&#34;&gt;Step 2: Determine Your Growth Objectives&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Set clear, measurable growth targets for your company.&lt;/li&gt;
&lt;li&gt;Align your growth objectives with your overall business strategy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;step-3-analyze-the-ansoff-matrix-quadrants&#34;&gt;Step 3: Analyze the Ansoff Matrix Quadrants&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Market Penetration&lt;/strong&gt;&lt;/p&gt;</description>
      <content>&lt;p&gt;The Ansoff Matrix provides a framework for determining the best approach based on your company&amp;rsquo;s current offerings and target market. Here&amp;rsquo;s how to use it.&lt;/p&gt;
&lt;p&gt;This standard operating procedure (SOP) outlines the steps for identifying and implementing your organization&amp;rsquo;s most suitable growth strategy.&lt;/p&gt;
&lt;h2 id=&#34;step-1-assess-your-current-position&#34;&gt;Step 1: Assess Your Current Position&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Evaluate your current products or services and their performance in the market.&lt;/li&gt;
&lt;li&gt;Identify your existing customer segments and their characteristics.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;step-2-determine-your-growth-objectives&#34;&gt;Step 2: Determine Your Growth Objectives&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Set clear, measurable growth targets for your company.&lt;/li&gt;
&lt;li&gt;Align your growth objectives with your overall business strategy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;step-3-analyze-the-ansoff-matrix-quadrants&#34;&gt;Step 3: Analyze the Ansoff Matrix Quadrants&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Market Penetration&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Determine if you can increase sales of existing products to current customers.&lt;/li&gt;
&lt;li&gt;Consider tactics such as conversion optimization, pricing adjustments, and referral programs.&lt;/li&gt;
&lt;li&gt;Focus on a marketing-led growth approach to drive conversions and leverage existing product-market fit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Market Development&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evaluate the potential for selling existing products to new customer segments, industries, or geographical markets.&lt;/li&gt;
&lt;li&gt;Define new ideal customer profiles (ICPs) and personas for targeted expansion.&lt;/li&gt;
&lt;li&gt;Invest in sales and marketing efforts to engage new prospects and gather market feedback.&lt;/li&gt;
&lt;li&gt;Explore partnerships to access specific market segments or lower the cost of sales.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Product (or Capability) Development&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Assess the opportunity to sell new products or services to existing customers.&lt;/li&gt;
&lt;li&gt;Prioritize product development based on customer requests and market demand.&lt;/li&gt;
&lt;li&gt;Consider acquiring rights to integrate complementary technologies or capabilities.&lt;/li&gt;
&lt;li&gt;Adopt a product-led growth approach, focusing on innovation and R&amp;amp;D.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Diversification (Pivot)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identify unique capabilities that can be leveraged to create entirely new products or services for different markets.&lt;/li&gt;
&lt;li&gt;Evaluate the feasibility and potential impact of a pivot strategy.&lt;/li&gt;
&lt;li&gt;Be prepared to adjust your positioning and invest in both product development and market penetration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;step-4-select-your-growth-strategy&#34;&gt;Step 4: Select Your Growth Strategy&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Based on your analysis of the Ansoff Matrix quadrants, choose the growth strategy that aligns best with your objectives and resources.&lt;/li&gt;
&lt;li&gt;Consider the trade-offs between focusing on high-value customers (requiring significant marketing and sales efforts) and pursuing a product-led growth approach with high viral potential.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;step-5-implement-and-monitor&#34;&gt;Step 5: Implement and Monitor&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Develop a detailed action plan to execute your chosen growth strategy.&lt;/li&gt;
&lt;li&gt;Allocate the necessary resources and assign responsibilities to team members.&lt;/li&gt;
&lt;li&gt;Establish key performance indicators (KPIs) to track progress and measure success.&lt;/li&gt;
&lt;li&gt;Regularly review and adjust your strategy based on market feedback and performance data.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;remember&#34;&gt;Remember&amp;hellip;&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;&amp;hellip;remain agile and adapt your approach as market conditions and your company&amp;rsquo;s capabilities evolve.&amp;rdquo;&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>The Power of Brands in B2B Decision-Making</title>
      <link>/posts/power-of-brands-b2b-decision-making/</link>
      <pubDate>Mon, 25 Aug 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/power-of-brands-b2b-decision-making/</guid>
      <description>&lt;p&gt;How do buyers make decisions in complex B2B sales, where large sums of money and critical business outcomes are at stake? A recent study sheds new light on this question, revealing brands&amp;rsquo; surprising and significant role in B2B purchasing behavior.&lt;/p&gt;
&lt;p&gt;The study challenges the conventional wisdom that B2B buying is an entirely rational process driven solely by objective factors like product specifications, price, and measurable ROI. Instead, the researchers found that brand perceptions and trust are important factors shaping decision-making, especially in high-risk or high-uncertainty situations.&lt;/p&gt;</description>
      <content>&lt;p&gt;How do buyers make decisions in complex B2B sales, where large sums of money and critical business outcomes are at stake? A recent study sheds new light on this question, revealing brands&amp;rsquo; surprising and significant role in B2B purchasing behavior.&lt;/p&gt;
&lt;p&gt;The study challenges the conventional wisdom that B2B buying is an entirely rational process driven solely by objective factors like product specifications, price, and measurable ROI. Instead, the researchers found that brand perceptions and trust are important factors shaping decision-making, especially in high-risk or high-uncertainty situations.&lt;/p&gt;
&lt;h2 id=&#34;brand-sensitivity-is-u-shaped&#34;&gt;Brand sensitivity is U-shaped&lt;/h2&gt;
&lt;p&gt;One of the study&amp;rsquo;s key findings is that buyers&amp;rsquo; sensitivity to brand influence follows a U-shaped pattern relative to the perceived risk of the purchase decision.&lt;/p&gt;
&lt;p&gt;When the stakes are low, brand matters. Buyers default to choosing a well-known or trusted brand as a choice-simplification heuristic. For example, think of shopping at a grocery and facing a wall of toothpaste options &amp;ndash; relying on a well-known brand reduces the effort required to decide.&lt;/p&gt;
&lt;p&gt;As the risk level rises from low to moderate, buyers tend to evaluate their options more rationally and systematically. They scrutinize product features, compare prices, and assess total cost of ownership. Brand perceptions are secondary to these more objective criteria.&lt;/p&gt;
&lt;p&gt;As risk levels climb into the high range, an interesting shift occurs. Faced with the complexity and uncertainty of a high-stakes decision, buyers again turn to brand &amp;ndash; this time as a risk-reduction heuristic. An established brand&amp;rsquo;s trusted reputation and proven track record can provide assurance and mitigate the perceived risk of the decision.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;The so-called IBM effect (i.e., the &amp;lsquo;you won&amp;rsquo;t get fired for buying IBM&amp;rsquo; principle) provides a well-accepted, contemporary example of how buyers weigh subjective factors relative to objective factors.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For decades, IBM established itself as the enterprise systems market leader despite lacking superior systems, functionality, or pricing.&lt;/p&gt;
&lt;h2 id=&#34;brand-dominance-is-self-sustaining&#34;&gt;Brand dominance is self-sustaining&lt;/h2&gt;
&lt;p&gt;Once a brand achieves a certain level of recognition and trust, it can enter a virtuous cycle that continually strengthens its position in the market. Here&amp;rsquo;s how this virtuous cycle plays out:&lt;/p&gt;
&lt;p&gt;As a brand becomes more widely recognized and trusted, more buyers choose it as a risk-reduction heuristic, especially in high-stakes situations. These choices lead to more successful customer experiences, which in turn generate positive word-of-mouth, testimonials, and case studies.&lt;/p&gt;
&lt;p&gt;This additional social proof and evidence of the brand&amp;rsquo;s value further enhances its reputation and trustworthiness, making it an even more appealing choice for risk-averse buyers. As more buyers continue to choose the brand, its market share and revenue grow, enabling greater investment in marketing, product development, and customer support.&lt;/p&gt;
&lt;p&gt;These investments help to maintain and extend the brand&amp;rsquo;s recognition, perceived value, and trust levels, attracting even more customers and reinforcing the cycle. Over time, this self-reinforcing loop can create a significant advantage for the leading brand, making it increasingly difficult for lesser-known brands to gain traction, even if they offer comparable or superior products or services.&lt;/p&gt;
&lt;h2 id=&#34;challenger-brands-must-focus-on-building-recognition-and-trust&#34;&gt;Challenger brands must focus on building recognition and trust&lt;/h2&gt;
&lt;p&gt;While competing against a dominant player&amp;rsquo;s brand recognition may be difficult, challenger brands can still gain traction by relentlessly building trust with their target customers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Build recognition&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A challenger brand trying to gain recognition against a well-known brand should consider reducing the &amp;ldquo;surface area&amp;rdquo; of its market. For example, a challenger brand might focus on marketing to specific accounts (ABM), a specific geographic region, a specific vertical, or some combination. Doing this makes it easier for the challenger brand to build a more substantial share of voice relative to the better-known brand.&lt;/p&gt;
&lt;p&gt;For example, challenger brands like Snowflake (cloud data warehousing) and Databricks (data analytics) have successfully employed vertical-specific strategies. They focused on healthcare, financial services, and retail sectors, where their solutions offer unique value. By building deep expertise and a strong reputation within these verticals, these brands have been able to compete effectively against larger, more established players.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Build trust&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Social proof should be integral to the brand experience, woven throughout the marketing and sales journey. By consistently showcasing the positive experiences of real customers, brands can build a sense of trust and validation that can help overcome buyer objections.&lt;/p&gt;
&lt;p&gt;This means using customer testimonials and quotes on the website and in marketing collateral, case studies that showcase specific customer successes and ROI, customer reference programs that allow prospects to speak directly with satisfied clients, third-party reviews and ratings on industry-specific review sites or platforms, and customer advocacy programs that encourage clients to spread positive word-of-mouth.&lt;/p&gt;
&lt;p&gt;In complex sales, trust is the currency of success.&lt;/p&gt;
&lt;h2 id=&#34;brand-matters&#34;&gt;Brand matters&lt;/h2&gt;
&lt;p&gt;CROs are often skeptical of investing in brand, preferring to invest primarily &amp;ndash; or only &amp;ndash; in growth marketing. This focus makes a lot of sense &amp;ndash; companies either grow or they die. However, there&amp;rsquo;s a good case that for complex B2B, brands are more than just names or logos. They are mental shortcuts, risk-reduction heuristics, and repositories of trust that can shape buyer behavior. For B2B marketers and salespeople, understanding and leveraging the power of brand at different levels of decision risk is not just a matter of aesthetic &amp;ndash; it&amp;rsquo;s a matter of business success.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Source Study:&lt;/strong&gt; &amp;ldquo;When do B2B Brands Influence the Decision-Making of Organizational Buyers? An Examination of the Relationship between Purchase Risk and Brand Sensitivity&amp;rdquo; by Brian Brown et al.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>6 Rules for Building Brand</title>
      <link>/posts/6-rules-building-brand/</link>
      <pubDate>Tue, 19 Aug 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/6-rules-building-brand/</guid>
      <description>&lt;p&gt;First published in 2010 and revised in 2014, Byron Sharp&amp;rsquo;s &lt;em&gt;How Brands Grow&lt;/em&gt; is a classic for marketers. It&amp;rsquo;s based on decades of research that are consistent in their findings about buying and brand performance; findings Sharp calls the &amp;ldquo;laws&amp;rdquo; of marketing because they are consistent across industries, across price points, and across time. The book presents these laws in context, and explores their meaning and marketing applications.&lt;/p&gt;
&lt;p&gt;The central idea is to make a brand &lt;strong&gt;easy to buy&lt;/strong&gt; by&lt;/p&gt;</description>
      <content>&lt;p&gt;First published in 2010 and revised in 2014, Byron Sharp&amp;rsquo;s &lt;em&gt;How Brands Grow&lt;/em&gt; is a classic for marketers. It&amp;rsquo;s based on decades of research that are consistent in their findings about buying and brand performance; findings Sharp calls the &amp;ldquo;laws&amp;rdquo; of marketing because they are consistent across industries, across price points, and across time. The book presents these laws in context, and explores their meaning and marketing applications.&lt;/p&gt;
&lt;p&gt;The central idea is to make a brand &lt;strong&gt;easy to buy&lt;/strong&gt; by&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ensuring mental availability: build connections between the brand and a category when a person is not actively buying&lt;/li&gt;
&lt;li&gt;ensuring physical availability: ensuring the product is easy to find and investigate when a person is actively buying&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most people, most of the time, aren&amp;rsquo;t buying in whatever category you&amp;rsquo;re selling. Your job as a marketer is to build &amp;ldquo;mental availability&amp;rdquo; &amp;ndash; connections between your brand and the category in a consumer&amp;rsquo;s mind. Now, when the person &lt;strong&gt;does&lt;/strong&gt; engage with a category, the connection with your brand is established.&lt;/p&gt;
&lt;p&gt;The evidence for this is the strong correlation between &lt;em&gt;share of voice&lt;/em&gt; and market share. Share of voice (the amount of media spending for a product vs the total media spend for the category) has been established as correlated with market share across every product imaginable; from consumer goods, to banking, to commodities like grain and steel.&lt;/p&gt;
&lt;p&gt;The book is written for a general audience, and much of the examples and insights are related to customer goods. However, it&amp;rsquo;s a mistake to think that B2B marketing is an entirely different beast. It absolutely is not. All of Sharp&amp;rsquo;s laws are applicable B2B, with the caveat that B2B marketers have to extend their strategy beyond Sharp&amp;rsquo;s book. Sharp ends at the purchase decision, which is different for toothpaste than it is for, say, an enterprise security solution.&lt;/p&gt;
&lt;p&gt;The way I think of it is that Sharp&amp;rsquo;s laws are related to branding and top-of-funnel campaigns in B2B. This is important because so many B2B companies get this wrong, using the same rational argument techniques for branding campaigns as they do in their product marketing. (Using purely rational arguments in your product marketing is also a mistake. There are few purchase decisions as emotionally rife as a B2B. Making a bad decision around toothpaste will not likely cause you to lose your job, but making a bad database recommendation certainly could. This is a topic for another post.)&lt;/p&gt;
&lt;p&gt;Here, then are Sharp&amp;rsquo;s laws of marketing. For B2B, think of them as laws of branding and awareness.&lt;/p&gt;
&lt;h2 id=&#34;law-1-refresh-and-build-associations&#34;&gt;Law 1: Refresh and build associations&lt;/h2&gt;
&lt;p&gt;The purpose of advertising is to construct and refresh memory structures. Memory structures are connections in the mind between the brand and the brand&amp;rsquo;s message. For example, Coca-Cola wants to build and reinforce a connection between Coke and fun times in people&amp;rsquo;s lives, like when everyone was out having a great time at a BBQ with their family. Microsoft wants to build a connection between Office and productivity.&lt;/p&gt;
&lt;p&gt;Memory structures must exist in a consumer&amp;rsquo;s head, or they will not notice your brand. Practical advice for marketers is to consider existing associations you can use and reinforce with your brand.&lt;/p&gt;
&lt;h2 id=&#34;law-2-avoid-being-silent&#34;&gt;Law 2: Avoid being silent&lt;/h2&gt;
&lt;p&gt;No brand, even the largest and most established brands, can afford to be silent. Memory structures strengthen with reinforcement and weaken with silence. People&amp;rsquo;s minds are busy, and information fades quickly if it&amp;rsquo;s not reinforced. (Think about the times you crammed for a test and how well you remember the subject one week after the test.)&lt;/p&gt;
&lt;p&gt;As time passes and people change, brands must constantly reinforce mental associations. Even well-established brands like Coca-Cola must do this, so they regularly update their advertisements.&lt;/p&gt;
&lt;p&gt;Practical advice for smaller B2B advertisers: If you have a small budget, consider using it on an ABM strategy to reach target buyers more often.&lt;/p&gt;
&lt;h2 id=&#34;law-3-make-sure-you-get-noticed&#34;&gt;Law 3: Make sure you get noticed&lt;/h2&gt;
&lt;p&gt;For marketing to work, it needs to be noticed, processed, and linked to the correct brand. Many companies instead focus on differentiation, explaining why their product is different (and better) than the competition. However, this can be a wasted effort unless the consumer actively researches the category.&lt;/p&gt;
&lt;p&gt;A key message from Sharp is that salience &amp;ndash; how prominent or noticeable something is &amp;ndash; is more important than differentiation, at least at the top of the funnel. At this stage, it matters most that you build the mental connection between the brand and the category.&lt;/p&gt;
&lt;p&gt;Practical advice is that when creating your brand, you have to figure out how to get it noticed among the competition. How can you stand out in a crowded market? What is distinctive about your assets?&lt;/p&gt;
&lt;h2 id=&#34;law-4-create-and-use-distinctive-brand-assets&#34;&gt;Law 4: Create and use distinctive brand assets&lt;/h2&gt;
&lt;p&gt;You can spend a lot of time, energy, and money building a mental association between a message and a brand. But if the assets aren&amp;rsquo;t distinctive to your brand, your efforts will be ineffective.&lt;/p&gt;
&lt;p&gt;And &amp;ldquo;distinctive&amp;rdquo; doesn&amp;rsquo;t (only) mean distinct in the sense that it&amp;rsquo;s easier to see, like brighter colors. It means distinct in the sense that it&amp;rsquo;s associated with your brand, and your brand only. Otherwise, you&amp;rsquo;ll dilute the connection. One way to measure this is to research brand assets in terms of fame (how often the assets is associated with any brand), and uniqueness (how strongly the asset is associated with &lt;em&gt;your&lt;/em&gt; brand). Consider this research on the Johnnie Walker Red Whiskey brand assets:&lt;/p&gt;
&lt;p&gt;We see two assets the company should reinforce and protect: the distinctive label and the walking man. Other assets tested didn&amp;rsquo;t fare as well, such as the color red. Most people didn&amp;rsquo;t associate red with any brand, and of those that did associate the color with a brand, it wasn&amp;rsquo;t particularly unique to Johnnie Walker. Finally, we see the asset &amp;ldquo;keep walking,&amp;rdquo; which wasn&amp;rsquo;t well known but was strongly associated with the brand. Efforts to promote this asset could make it better known and a stronger advocate for the brand.&lt;/p&gt;
&lt;p&gt;Practical advice is to research your brand&amp;rsquo;s distinctive assets &amp;ndash; assets that consumers associate with your brand and with nothing else. Then you need to use and protect these.&lt;/p&gt;
&lt;h2 id=&#34;law-5-be-consistent&#34;&gt;Law 5: Be consistent&lt;/h2&gt;
&lt;p&gt;Sharp points out that consistency in brand identity is something that many brand strategies lack, particularly across campaigns. For example, when a new campaign is created, most of the attention is placed on what is new and fresh. More attention should be placed on making sure the branding elements are similar and consistent; someone who saw the last marketing campaign should understand that the new campaign comes from the same brand.&lt;/p&gt;
&lt;p&gt;Proponents of integrated marketing campaigns have emphasized the importance of consistency, but it&amp;rsquo;s a mistake to embrace the idea of consistency across media but not consistency across your brand&amp;rsquo;s distinctive assets. Remember, too, that the objective is to create mental associations before the consumer is actively buying. At this stage, emphasize consistency in the visual, verbal or style of branding elements. It is only when there is discipline in this consistency that distinctive brand assets build.&lt;/p&gt;
&lt;h2 id=&#34;law-6-stay-competitive&#34;&gt;Law 6: Stay competitive&lt;/h2&gt;
&lt;p&gt;This is where the rubber hits the road regarding your efforts to build mental associations for your brand. Your brand must be available when a person enters a category and are interested in buying. This can mean that it is physically available, such as a brand of toothpaste that must be sitting on a shelf. It can also mean digitally available, such as findable in Google SERPs.&lt;/p&gt;
&lt;p&gt;For most technical enterprise B2B, availability goes beyond being found in SERPs. This is when product marketing comes into play &amp;ndash; we&amp;rsquo;ve captured the consumer&amp;rsquo;s attention, now we need to take advantage of it by removing obstacles, explaining features, encouraging trials, and addressing concerns about pricing, support, or longevity.&lt;/p&gt;
&lt;h2 id=&#34;more-reading&#34;&gt;More reading&lt;/h2&gt;
&lt;p&gt;A great reference for the interplay between long term (awareness/association-building) campaigns and short term (availability/product) campaigns is Les Binet&amp;rsquo;s and Peter Field&amp;rsquo;s &lt;em&gt;The Long and the Short of It,&lt;/em&gt; which provides research based suggestions on how to balance investment in these two marketing objectives.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>The Surprising Power of Price: Marketing Can Influence Product Efficacy</title>
      <link>/posts/price-product-efficacy/</link>
      <pubDate>Sat, 26 Jul 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/price-product-efficacy/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Higher-priced products are more effective than lower-priced (but otherwise identical) products. They don&amp;rsquo;t just seem more effective; they actually are more effective.&lt;/p&gt;
&lt;p&gt;Have you ever wondered why brand-name Ibuprofen seems to work better than generic, even though each contain the same ingredients? Recent research suggests that the answer may lie not just in the product itself but also in its marketing &amp;ndash; specifically, the price.&lt;/p&gt;
&lt;h2 id=&#34;higher-price--better-efficacy&#34;&gt;Higher Price = Better Efficacy&lt;/h2&gt;
&lt;p&gt;A fascinating series of experiments demonstrated that pricing can significantly impact product efficacy, a phenomenon the researchers termed the &amp;ldquo;placebo effect of marketing actions.&amp;rdquo; Their findings, published in the Journal of Marketing Research, shed light on the complex relationship between price and perceived quality.&lt;/p&gt;</description>
      <content>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Higher-priced products are more effective than lower-priced (but otherwise identical) products. They don&amp;rsquo;t just seem more effective; they actually are more effective.&lt;/p&gt;
&lt;p&gt;Have you ever wondered why brand-name Ibuprofen seems to work better than generic, even though each contain the same ingredients? Recent research suggests that the answer may lie not just in the product itself but also in its marketing &amp;ndash; specifically, the price.&lt;/p&gt;
&lt;h2 id=&#34;higher-price--better-efficacy&#34;&gt;Higher Price = Better Efficacy&lt;/h2&gt;
&lt;p&gt;A fascinating series of experiments demonstrated that pricing can significantly impact product efficacy, a phenomenon the researchers termed the &amp;ldquo;placebo effect of marketing actions.&amp;rdquo; Their findings, published in the Journal of Marketing Research, shed light on the complex relationship between price and perceived quality.&lt;/p&gt;
&lt;p&gt;The experiments focused on an energy drink called SoBe, which claims to improve mental acuity. After consuming the drink, which was available at either its regular price or a discounted price, participants were asked to solve a series of puzzles. Those who purchased the drink at a discount consistently solved fewer puzzles than those who bought it at the regular (higher) price. This suggests that the mere act of paying less for a product can actually reduce its effectiveness.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s behind this phenomenon? The researchers propose that it all comes down to expectancies &amp;ndash; the consumers&amp;rsquo; beliefs and expectations about a product&amp;rsquo;s efficacy. When we see a high price, we tend to believe that the product must be of high quality and, therefore, more effective. Conversely, a low price can signal lower quality and effectiveness. These beliefs are activated automatically and non-consciously, influencing our behavior without us even realizing it.&lt;/p&gt;
&lt;p&gt;The study also revealed a &amp;ldquo;desirable&amp;rdquo; placebo effect: When participants were exposed to strong advertising claims about the drink&amp;rsquo;s effectiveness, those who paid the regular price solved more puzzles than those in the control group who didn&amp;rsquo;t consume the drink at all. This highlights the power of marketing to not only influence perception but also enhance products&amp;rsquo; real-world efficacy.&lt;/p&gt;
&lt;h2 id=&#34;explaining-the-disconnect-between-objective-quality-vs-perceived-quality&#34;&gt;Explaining the disconnect between objective quality vs. perceived quality&lt;/h2&gt;
&lt;p&gt;These findings have implications beyond energy drinks and puzzle-solving. As Gregory Berns discusses in his commentary on the study, the placebo effect of pricing may help explain the well-documented disconnect between objective product quality (as measured by expert ratings or objective criteria) and perceived quality in consumers&amp;rsquo; minds.&lt;/p&gt;
&lt;p&gt;That is, if higher prices can lead to improved product performance, this may partly explain why consumers continue to buy expensive branded products even when cheaper alternatives are available.&lt;/p&gt;
&lt;p&gt;However, Berns also raises some questions about the neural mechanisms behind this effect. While the SoBe study suggests that expectancies are the key mediator, more research is needed to understand exactly how beliefs about price and quality are represented and activated in the brain. Neuroimaging techniques like fMRI may help to shed light on these questions and deepen our understanding of the placebo effect.&lt;/p&gt;
&lt;p&gt;For marketers, these findings underscore the importance of carefully considering pricing strategies and the messages conveyed through advertising and branding. While slashing prices to attract customers may be tempting, doing so could have unintended consequences for product perceptions and even actual efficacy. At the same time, emphasizing the quality and effectiveness of a product through strong advertising claims could enhance its real-world performance.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Metrics every B2B SaaS Should Track</title>
      <link>/posts/9-key-metrics/</link>
      <pubDate>Wed, 18 Jun 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/9-key-metrics/</guid>
      <description>&lt;p&gt;Driving growth requires focusing on key metrics across the customer journey. Tracking the right metrics is necessary for success, from acquiring new customers to retaining existing ones and expanding revenue per customer.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at the three essential pipeline and growth metrics that investors in SaaS businesses care about most.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not enough to build these analytics for the business overall; rather, the data should also be filtered by market segments (e.g., what is the ACV for industry verticals? How about industry verticals in a particular region? Etc.) This way you can focus on the most valuable channels with the most valuable customers.&lt;/p&gt;</description>
      <content>&lt;p&gt;Driving growth requires focusing on key metrics across the customer journey. Tracking the right metrics is necessary for success, from acquiring new customers to retaining existing ones and expanding revenue per customer.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at the three essential pipeline and growth metrics that investors in SaaS businesses care about most.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not enough to build these analytics for the business overall; rather, the data should also be filtered by market segments (e.g., what is the ACV for industry verticals? How about industry verticals in a particular region? Etc.) This way you can focus on the most valuable channels with the most valuable customers.&lt;/p&gt;
&lt;h2 id=&#34;acquisition-metrics&#34;&gt;Acquisition Metrics&lt;/h2&gt;
&lt;p&gt;The first group of metrics focuses on customer acquisition. Key metrics to track include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Qualified Lead Velocity Rate&lt;/strong&gt;: This measures the monthly growth of Marketing Qualified Leads (MQLs) in your pipeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lead Quality&lt;/strong&gt;: A great way to measure lead quality is to multiply the win rate percentage by the Average Contract Value (ACV). Higher-quality leads result in better win rates and larger deals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discretionary Customer Acquisition Cost (CAC)&lt;/strong&gt;: Tracking the discretionary spend on acquiring new customers, excluding fixed costs like salaries, allows for short-term optimization of acquisition efforts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CAC Recovery Time&lt;/strong&gt;: Measuring how long it takes to recover the cost of acquiring a customer is essential for ensuring sustainable growth.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Win/Loss Ratio&lt;/strong&gt;: Straightforward &amp;ndash; the ratio of Closed (won) vs. Closed (lost)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;revenue-metrics&#34;&gt;Revenue Metrics&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s all about the money, after all&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Average Contract Value (ACV)&lt;/strong&gt;: The average monetary value of a customer contract over a specified period, typically a year.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monthly Recurring Revenue (MRR)&lt;/strong&gt;: The predictable total revenue generated from all active customer subscriptions in a given month.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customer Lifetime Value (CLV)&lt;/strong&gt;: The total net profit a company expects to earn from an individual customer over the entire duration of their relationship with the business.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Revenue by Lead Source&lt;/strong&gt;: A breakdown of the total revenue generated from customers acquired through different marketing channels or lead sources.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;retention-metrics&#34;&gt;Retention Metrics&lt;/h2&gt;
&lt;p&gt;Retaining customers is just as important as acquiring new ones. Two key metrics to monitor are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Logo Churn&lt;/strong&gt;: Track the percentage of customers who leave after the initial onboarding period. Aim to minimize churn beyond this point to maintain a stable customer base.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick Ratio&lt;/strong&gt;: This metric provides a holistic view of your company&amp;rsquo;s growth efficiency. It describes the dollars of new revenue generated for every dollar lost. Calculate it by dividing (new MRR + expansion MRR) by (churned MRR + contraction MRR). A Quick Ratio of 4 is considered the minimum threshold for healthy SaaS companies, meaning that the company is generating $4 of new and expansion MRR for every $1 of lost MRR due to churn and contraction.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;expansion-metrics&#34;&gt;Expansion Metrics&lt;/h2&gt;
&lt;p&gt;Growing revenue from existing customers is a powerful driver of exponential growth. Key metrics to track include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Annual Revenue Per Unit (ARPU) Growth&lt;/strong&gt;: Measure the year-over-year increase in revenue per customer (or unit). Aim for at least 10% annual ARPU growth.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engaged Advocates&lt;/strong&gt;: Track the number of customers who actively refer others to your product or service. Engaged advocates are a strong indicator of customer satisfaction and a key growth driver.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monthly Active Users (MAU)&lt;/strong&gt;: Monitor the number of unique users engaging with your product each month. Growing MAU indicates increasing adoption and value delivered to customers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By focusing on these three groups of metrics - Acquisition, Retention, and Expansion - you gain a comprehensive view of their growth performance. Regularly tracking and optimizing these metrics will help you make data-driven decisions, identify areas for improvement, and ultimately drive the exponential growth that investors expect.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Adding an R kernel to Jupyter Lab</title>
      <link>/posts/adding-an-r-kernel-to-jupyter-lab/</link>
      <pubDate>Wed, 19 Feb 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/adding-an-r-kernel-to-jupyter-lab/</guid>
      <description>&lt;p&gt;Being bilingual has been shown to increase people&amp;rsquo;s ability to focus and concentrate, solve problems, and have better mental flexibility.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also important that data scientists limit themselves to relying on a single programming language for data management, visualization, modeling, and deployment.&lt;/p&gt;
&lt;p&gt;JupyterLab is a web-based interactive development environment for data analysis, scientific computing, and predictive modeling.&lt;/p&gt;
&lt;h2 id=&#34;step-1---install-anaconda&#34;&gt;Step 1 - Install Anaconda&lt;/h2&gt;
&lt;p&gt;First we need to download and install the Anaconda from the official website.&lt;/p&gt;</description>
      <content>&lt;p&gt;Being bilingual has been shown to increase people&amp;rsquo;s ability to focus and concentrate, solve problems, and have better mental flexibility.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also important that data scientists limit themselves to relying on a single programming language for data management, visualization, modeling, and deployment.&lt;/p&gt;
&lt;p&gt;JupyterLab is a web-based interactive development environment for data analysis, scientific computing, and predictive modeling.&lt;/p&gt;
&lt;h2 id=&#34;step-1---install-anaconda&#34;&gt;Step 1 - Install Anaconda&lt;/h2&gt;
&lt;p&gt;First we need to download and install the Anaconda from the official website.&lt;/p&gt;
&lt;p&gt;After downloading and installing Anaconda, open a new macOS Terminal and make sure everything was installed correctly by entering the following commands:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ Jupyter Lab
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This should open your web browser displaying the JupyterLab interface. The Anaconda environment has sections for opening a Python Kernel in a Jupyter Notebook or the Console.&lt;/p&gt;
&lt;p&gt;Python is run via Jupyter&amp;rsquo;s kernel. Under the Other section, there are also options for starting a bash shell session, creating new text or markdown files, or getting contextual help.&lt;/p&gt;
&lt;h2 id=&#34;step-2---install-the-necessary-r-packages&#34;&gt;Step 2 - Install the necessary R packages&lt;/h2&gt;
&lt;p&gt;There are nine packages we need to install to setup the R Kernel in the Jupyter Lab environment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;repr&lt;/strong&gt;: String and binary representations of objects for several formats mime types.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IRdisplay&lt;/strong&gt;: An interface to the rich display capabilities of Jupyter front-ends.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;evaluate&lt;/strong&gt;: Parsing and evaluation tools that make it easy to recreate the command line behavior of R.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;crayon&lt;/strong&gt;: Colored terminal output on terminals that support ANSI color and highlight codes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pbdZMQ&lt;/strong&gt;: An R package providing a simplified interface to ZeroMQ with a focus on client/server programming frameworks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;devtools&lt;/strong&gt;: Collection of package development tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;uuid&lt;/strong&gt;: Tools for generating and handling of UUIDs (Universally Unique Identifiers).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;digest&lt;/strong&gt;: Provides hash function summaries for GNU R objects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IRkernel&lt;/strong&gt;: R kernel for Jupyter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These packages can be installed by running the code below in the R console:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# install from CRAN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;install.packages&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;repr&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;IRdisplay&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;evaluate&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;crayon&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pbdZMQ&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;devtools&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;uuid&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;digest&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# from github&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;devtools&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;install_github&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;IRkernel/IRkernel&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After we&amp;rsquo;ve installed these packages, we need to find our version of R on our local machine. On macOS, it is usually located in the &lt;code&gt;/Library/Frameworks&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;We use the pwd command in Terminal to show where the application is, and then use &lt;code&gt;open R&lt;/code&gt; to launch a session of R in the Terminal.&lt;/p&gt;
&lt;p&gt;Once in the R session, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;IRkernel&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;installspec&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# [InstallKernelSpec] Installed kernelspec ir in /Users/mjfrigaard/Library/Jupyter/kernels/ir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;IRkernel&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;installspec&lt;/span&gt;(user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FALSE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# [InstallKernelSpec] Installed kernelspec ir in /usr/local/share/jupyter/kernels/ir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After these have been installed, we need to close the JupyterLab environment by exiting out of the browser. We will also need to close the Jupyter Kernel in the Terminal by clicking on &lt;code&gt;ctrl + c&lt;/code&gt; and then &lt;code&gt;y&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[I 08:22:46.480 LabApp] interrupted
Serving notebooks from local directory: /Users/path/to/project/
0 active kernels
The Jupyter Notebook is running at:
http://localhost:8888/?token=de9b3fdc50a633411e67c9596f5090e5f0d4d18bcac6c860
 or http://127.0.0.1:8888/?token=de9b3fdc50a633411e67c9596f5090e5f0d4d18bcac6c860
Shutdown this notebook server (y/[n])? y
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Start another JupyterLab session and you should see the option for an R Kernel under the Notebook and Console sections.&lt;/p&gt;
&lt;h2 id=&#34;step-3---launch-an-r-kernel-from-jupyter&#34;&gt;Step 3 - Launch an R Kernel from Jupyter&lt;/h2&gt;
&lt;p&gt;Now we want to launch the R Kernel and enter some R code to make sure everything is working. We can test the R Kernel in a Notebook, because Jupyter notebooks give us the ability to insert R code, markdown, or plain text code cells.&lt;/p&gt;
&lt;h3 id=&#34;running-r-from-jupyter-notebook&#34;&gt;Running R from Jupyter Notebook&lt;/h3&gt;
&lt;p&gt;We now have an R Kernel running in Jupyter Lab. The code below loads the popular tidyverse package from RStudio:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;suppressPackageStartupMessages&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;library&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tidyverse&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tidyverse&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;tidyverse_logo&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can write in markdown or code, just like the Python environment:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;diamonds &lt;span style=&#34;color:#f92672&#34;&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ggplot2&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ggplot&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;aes&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; carat, y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; price, color &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; cut)) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ggplot2&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;geom_point&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ggplot2&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;geom_smooth&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#&amp;gt;  `geom_smooth()` using method = &amp;#39;gam&amp;#39; and formula &amp;#39;y ~ s(x, bs = &amp;#34;cs&amp;#34;)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content>
    </item>
    
    <item>
      <title>Boolean Indexing Using Pandas</title>
      <link>/posts/boolean-indexing-using-pandas/</link>
      <pubDate>Wed, 19 Feb 2025 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/boolean-indexing-using-pandas/</guid>
      <description>&lt;p&gt;A boolean operation returns only True or False, and can only be performed against a series. The process of boolean indexing involves two steps: first, evaluate the series to identify true/false values, then filter the dataframe based on results.&lt;/p&gt;
&lt;h2 id=&#34;operators&#34;&gt;Operators&lt;/h2&gt;
&lt;p&gt;Here are the standard boolean operators:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;== a&lt;/code&gt; : Equality comparison&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~a&lt;/code&gt; : Negation (NOT)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a &amp;gt; b&lt;/code&gt; : Greater than&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a &amp;lt; b&lt;/code&gt; : Less than&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a &amp;amp; b&lt;/code&gt; : AND operator&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a | b&lt;/code&gt; : OR operator&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;filtering-a-dataframe&#34;&gt;Filtering a Dataframe&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s demonstrate filtering using a dataset. First, create an evaluation series:&lt;/p&gt;</description>
      <content>&lt;p&gt;A boolean operation returns only True or False, and can only be performed against a series. The process of boolean indexing involves two steps: first, evaluate the series to identify true/false values, then filter the dataframe based on results.&lt;/p&gt;
&lt;h2 id=&#34;operators&#34;&gt;Operators&lt;/h2&gt;
&lt;p&gt;Here are the standard boolean operators:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;== a&lt;/code&gt; : Equality comparison&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~a&lt;/code&gt; : Negation (NOT)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a &amp;gt; b&lt;/code&gt; : Greater than&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a &amp;lt; b&lt;/code&gt; : Less than&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a &amp;amp; b&lt;/code&gt; : AND operator&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a | b&lt;/code&gt; : OR operator&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;filtering-a-dataframe&#34;&gt;Filtering a Dataframe&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s demonstrate filtering using a dataset. First, create an evaluation series:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;evaluation &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; df[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;number&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This identifies entries meeting the condition. Next, apply the filter to return matching rows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;df[evaluation]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;selecting-specific-data&#34;&gt;Selecting Specific Data&lt;/h2&gt;
&lt;p&gt;You can combine conditions for more advanced filtering.&lt;/p&gt;
&lt;p&gt;Combining OR conditions across country values:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;df[(df[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;country&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;USA&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; (df[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;country&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Canada&amp;#39;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using negation with AND to exclude specific criteria while filtering by sector:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;df[(&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;df[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;country&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;USA&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (df[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sector&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Technology&amp;#39;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Boolean indexing enables data exploration by creating filtered datasets based on conditional logic applied to dataframe columns.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>5 Steps to Position Your Company for Success in a Competitive Market</title>
      <link>/posts/5-steps-to-position-your-company-for-success-in-a-competitive-market/</link>
      <pubDate>Tue, 26 Mar 2024 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/5-steps-to-position-your-company-for-success-in-a-competitive-market/</guid>
      <description>&lt;p&gt;In a crowded market, you need to differentiate your company from the competition. Following these five steps, you can effectively position your company to stand out and capture your target market&amp;rsquo;s attention.&lt;/p&gt;
&lt;h2 id=&#34;step-1-identify-what-you-do-best-ignoring-the-competition-for-now&#34;&gt;Step 1: Identify what you do best (ignoring the competition for now)&lt;/h2&gt;
&lt;p&gt;Start by asking yourself, &amp;ldquo;What does our solution do best?&amp;rdquo; Focus on articulating the benefits rather than just listing features. Consider why customers choose your company and what makes your solution special. Imagine proudly sharing your company&amp;rsquo;s strengths with an old friend. Generate a list of at least 10 things, including features, benefits, and capabilities.&lt;/p&gt;</description>
      <content>&lt;p&gt;In a crowded market, you need to differentiate your company from the competition. Following these five steps, you can effectively position your company to stand out and capture your target market&amp;rsquo;s attention.&lt;/p&gt;
&lt;h2 id=&#34;step-1-identify-what-you-do-best-ignoring-the-competition-for-now&#34;&gt;Step 1: Identify what you do best (ignoring the competition for now)&lt;/h2&gt;
&lt;p&gt;Start by asking yourself, &amp;ldquo;What does our solution do best?&amp;rdquo; Focus on articulating the benefits rather than just listing features. Consider why customers choose your company and what makes your solution special. Imagine proudly sharing your company&amp;rsquo;s strengths with an old friend. Generate a list of at least 10 things, including features, benefits, and capabilities.&lt;/p&gt;
&lt;h2 id=&#34;step-2-determine-what-you-do-better-than-others&#34;&gt;Step 2: Determine what you do better than others&lt;/h2&gt;
&lt;p&gt;Using the list from step one, filter out the superpowers that make you stand out from your competitors. What do you do better than anyone else in the market? Consider factors like reliability, service quality, technology leadership, and product quality. These are often based on customers&amp;rsquo; perceptions rather than raw statistics. You have a winning formula if you can make these intangible factors tangible.&lt;/p&gt;
&lt;h2 id=&#34;step-3-identify-what-only-you-can-do&#34;&gt;Step 3: Identify what only you can do&lt;/h2&gt;
&lt;p&gt;Now, focus on what makes your solution truly unique. What is something that no other company can do as well as you? This forms the basis of your value proposition pillars. Not every company will have an &amp;ldquo;only,&amp;rdquo; but aim for two to three unique aspects. Consider any promises, guarantees, or undisputed claims about your secret sauce and capabilities that set you apart.&lt;/p&gt;
&lt;h2 id=&#34;step-4-choose-the-right-positioning-vectors&#34;&gt;Step 4: Choose the right positioning vectors&lt;/h2&gt;
&lt;p&gt;Narrow the output from the &amp;ldquo;Best, Better, Only&amp;rdquo; exercise into a handful of elements to position your company. Obsess over your ideal customer and their needs, and effectively communicate how your product meets those needs. Select three to five of the best benefits, factors, features, or metrics, ideally focusing on the &amp;ldquo;Only&amp;rdquo; category.&lt;/p&gt;
&lt;h2 id=&#34;step-5-plot-your-position-against-the-alternatives&#34;&gt;Step 5: Plot your position against the alternatives&lt;/h2&gt;
&lt;p&gt;Using the positioning vectors you&amp;rsquo;ve identified, compare your company to your competitors. A simple scatterplot can help you visualize how you stack up against the competition across two variables. For more than two vectors, consider using other types of charts for competitor analysis. This exercise will force you to examine your market and identify your closest competitors objectively. Use these insights to inform your messaging strategy and content as you go to market.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Getting Started with the Google Ads API Using Python</title>
      <link>/posts/getting-started-with-the-google-ads-api-using-python-3/</link>
      <pubDate>Mon, 19 Feb 2024 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/getting-started-with-the-google-ads-api-using-python-3/</guid>
      <description>&lt;p&gt;Launching with the Google Ads API involves multiple steps that can feel overwhelming. This guide walks through the entire process comprehensively to help you succeed.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the complete roadmap:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Establish a Google Ads manager account (if you don&amp;rsquo;t have one)&lt;/li&gt;
&lt;li&gt;Request a developer token through your manager account&lt;/li&gt;
&lt;li&gt;Set up a Google Ads manager TEST account&lt;/li&gt;
&lt;li&gt;Set up a Google Ads regular TEST account&lt;/li&gt;
&lt;li&gt;Build sample campaigns in your regular test account&lt;/li&gt;
&lt;li&gt;Establish a Google Cloud project&lt;/li&gt;
&lt;li&gt;Activate the Google Ads API within your Cloud Project&lt;/li&gt;
&lt;li&gt;Obtain OAUTH credentials from Cloud Project&lt;/li&gt;
&lt;li&gt;Export credentials as JSON format&lt;/li&gt;
&lt;li&gt;Download the Google Ads API library via pip&lt;/li&gt;
&lt;li&gt;Clone the Google Ads API GitHub repository&lt;/li&gt;
&lt;li&gt;Execute a credential script to obtain a refresh token&lt;/li&gt;
&lt;li&gt;Transfer a YAML configuration file to your home directory&lt;/li&gt;
&lt;li&gt;Populate the YAML with your OAUTH credentials, developer token, and refresh token&lt;/li&gt;
&lt;li&gt;Execute your inaugural API request&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-a-google-ads-manager-account&#34;&gt;Get a Google Ads Manager Account&lt;/h2&gt;
&lt;p&gt;Two distinct Google Ads account types exist:&lt;/p&gt;</description>
      <content>&lt;p&gt;Launching with the Google Ads API involves multiple steps that can feel overwhelming. This guide walks through the entire process comprehensively to help you succeed.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the complete roadmap:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Establish a Google Ads manager account (if you don&amp;rsquo;t have one)&lt;/li&gt;
&lt;li&gt;Request a developer token through your manager account&lt;/li&gt;
&lt;li&gt;Set up a Google Ads manager TEST account&lt;/li&gt;
&lt;li&gt;Set up a Google Ads regular TEST account&lt;/li&gt;
&lt;li&gt;Build sample campaigns in your regular test account&lt;/li&gt;
&lt;li&gt;Establish a Google Cloud project&lt;/li&gt;
&lt;li&gt;Activate the Google Ads API within your Cloud Project&lt;/li&gt;
&lt;li&gt;Obtain OAUTH credentials from Cloud Project&lt;/li&gt;
&lt;li&gt;Export credentials as JSON format&lt;/li&gt;
&lt;li&gt;Download the Google Ads API library via pip&lt;/li&gt;
&lt;li&gt;Clone the Google Ads API GitHub repository&lt;/li&gt;
&lt;li&gt;Execute a credential script to obtain a refresh token&lt;/li&gt;
&lt;li&gt;Transfer a YAML configuration file to your home directory&lt;/li&gt;
&lt;li&gt;Populate the YAML with your OAUTH credentials, developer token, and refresh token&lt;/li&gt;
&lt;li&gt;Execute your inaugural API request&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-a-google-ads-manager-account&#34;&gt;Get a Google Ads Manager Account&lt;/h2&gt;
&lt;p&gt;Two distinct Google Ads account types exist:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regular account:&lt;/strong&gt; This functions as an operational account where you develop and execute advertising campaigns.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Manager account:&lt;/strong&gt; This serves as a parent account for overseeing multiple regular accounts.&lt;/p&gt;
&lt;p&gt;Manager accounts cannot run advertisements directly — they exist solely for supervision purposes. Marketing agencies, for instance, typically maintain two accounts: one regular account for their own promotions and one manager account for client management.&lt;/p&gt;
&lt;p&gt;Without an existing manager account, establish one by visiting the &lt;a href=&#34;https://ads.google.com/home/tools/manager-accounts/&#34;&gt;Google Ads Manager Homepage&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;get-a-developer-token&#34;&gt;Get a Developer Token&lt;/h2&gt;
&lt;p&gt;A developer token represents your first required credential for API access. Obtaining one is straightforward. Access your Manager account and navigate to &lt;strong&gt;TOOLS &amp;amp; SETTINGS &amp;gt; SETUP &amp;gt; API Center&lt;/strong&gt;. (This option appears exclusively in Manager Accounts.)&lt;/p&gt;
&lt;p&gt;Complete the application form, acknowledge the terms and conditions, and submit. Provide an active email address you monitor regularly. Once approved, your token displays as an alphanumeric string in the API Center.&lt;/p&gt;
&lt;p&gt;Save this token in a readily accessible location, such as a text document.&lt;/p&gt;
&lt;h2 id=&#34;set-up-a-google-ads-test-manager-account&#34;&gt;Set Up a Google Ads TEST Manager Account&lt;/h2&gt;
&lt;p&gt;Initially, Google restricts API access to production accounts. For API development, you require a test environment. Create a second manager account by revisiting the &lt;a href=&#34;https://ads.google.com/home/tools/manager-accounts/&#34;&gt;Google Ads Manager Homepage&lt;/a&gt; and establishing another MCC using your existing email address.&lt;/p&gt;
&lt;p&gt;This creates a test account, identifiable by the red &amp;ldquo;test account&amp;rdquo; badge displayed prominently.&lt;/p&gt;
&lt;h2 id=&#34;set-up-a-google-ads-test-regular-account&#34;&gt;Set Up a Google Ads TEST Regular Account&lt;/h2&gt;
&lt;p&gt;The documentation references generating test accounts &amp;ldquo;using the Google UI,&amp;rdquo; which can confuse newcomers. The actual process involves clicking &lt;strong&gt;ACCOUNTS&lt;/strong&gt; in the left navigation menu, then selecting the &amp;ldquo;+&amp;rdquo; link.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT NOTE:&lt;/strong&gt; The interface will display a complaint about account usability, present a billing warning, and appear unresponsive.&lt;/p&gt;
&lt;p&gt;Community forums overflow with users reporting that test account creation appears unsuccessful. Google acknowledges this issue and promises resolution, though if you experience this, understand that your account exists — it&amp;rsquo;s simply concealed. Access the filter option and select &amp;ldquo;Show hidden&amp;rdquo; to reveal it.&lt;/p&gt;
&lt;p&gt;Preserve the regular test account number in an accessible document.&lt;/p&gt;
&lt;h2 id=&#34;create-a-test-campaign-in-your-test-account&#34;&gt;Create a Test Campaign in Your Test Account&lt;/h2&gt;
&lt;p&gt;Enter your regular test account by selecting the corresponding link in your Manager account&amp;rsquo;s upper left corner.&lt;/p&gt;
&lt;p&gt;Generate a campaign by clicking &lt;strong&gt;campaigns&lt;/strong&gt; in the left sidebar and then the &amp;ldquo;+&amp;rdquo; link.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important context about test accounts:&lt;/strong&gt; They contain no authentic data. Although you can create campaigns, they remain unpopulated with information, including simulated data for impressions, clicks, and budgets.&lt;/p&gt;
&lt;p&gt;Users anticipate test accounts resembling production environments with sample metrics — Facebook implements this approach, but Google does not. This disparity generates extensive community frustration documented across forums for years, yet Google has made no adjustments.&lt;/p&gt;
&lt;p&gt;Instead, Google recommends exporting production data as CSV format and simulating API retrieval from it.&lt;/p&gt;
&lt;h2 id=&#34;set-up-your-google-cloud-project&#34;&gt;Set Up Your Google Cloud Project&lt;/h2&gt;
&lt;p&gt;This process demands additional steps. API usage requires establishing a Google Cloud project, enabling the Google Ads API within it, and configuring authorization credentials.&lt;/p&gt;
&lt;p&gt;Begin by logging into &lt;a href=&#34;https://console.cloud.google.com/&#34;&gt;Google Cloud&lt;/a&gt; using your Manager Account credentials.&lt;/p&gt;
&lt;h3 id=&#34;create-a-google-cloud-project&#34;&gt;Create a Google Cloud Project&lt;/h3&gt;
&lt;p&gt;In the upper left area, select the project for use with the Google Ads API. Should you lack a project, select New Project.&lt;/p&gt;
&lt;p&gt;You may encounter billing setup prompts (particularly if you haven&amp;rsquo;t previously entered payment information). Complete this process. Unless you execute thousands of daily API calls or utilize substantial additional cloud resources, billing concerns are minimal.&lt;/p&gt;
&lt;h3 id=&#34;enable-the-google-ads-api-in-your-project&#34;&gt;Enable the Google Ads API in Your Project&lt;/h3&gt;
&lt;p&gt;Verify your project selection, then select &lt;strong&gt;APIs and Services&lt;/strong&gt; from the left sidebar.&lt;/p&gt;
&lt;p&gt;Select the &lt;strong&gt;+ API and Services&lt;/strong&gt; link at the page&amp;rsquo;s top.&lt;/p&gt;
&lt;p&gt;Locate Google Ads in the search results. Upon finding it, select it and click &lt;strong&gt;ENABLE&lt;/strong&gt;. When asked about application category, choose &lt;strong&gt;Installed App&lt;/strong&gt; (select Web App if constructing a multi-user platform for account access — unlikely for beginners).&lt;/p&gt;
&lt;h3 id=&#34;create-your-credentials&#34;&gt;Create Your Credentials&lt;/h3&gt;
&lt;p&gt;Return to &lt;strong&gt;APIs and Services&lt;/strong&gt;, then select &lt;strong&gt;credentials&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;On the Credentials interface, select &lt;strong&gt;CREATE CREDENTIALS&lt;/strong&gt;, then choose &lt;strong&gt;OAuth client ID&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Select &lt;strong&gt;&amp;ldquo;Other&amp;rdquo;&lt;/strong&gt; as the application type.&lt;/p&gt;
&lt;p&gt;Two credentials display: a client ID and corresponding secret. Store both values securely in a text document.&lt;/p&gt;
&lt;p&gt;After closing this dialog, only the Client ID appears on the main credentials page. To access your secret subsequently, select your OAUTH credentials by name.&lt;/p&gt;
&lt;h3 id=&#34;download-your-credentials-as-a-json-file&#34;&gt;Download Your Credentials as a JSON File&lt;/h3&gt;
&lt;p&gt;On the credentials page, a download icon appears to the right of your OAUTH credentials. Selecting this downloads credentials in JSON format.&lt;/p&gt;
&lt;p&gt;The downloaded file carries an extensive filename. For practical purposes, rename it to something manageable like &amp;ldquo;secrets.json&amp;rdquo;. Move this file from your downloads folder to an accessible location, such as your home directory.&lt;/p&gt;
&lt;h2 id=&#34;get-the-api-library-on-your-computer&#34;&gt;Get the API Library on Your Computer&lt;/h2&gt;
&lt;p&gt;Now comes the exciting part — retrieving the Google Ads API locally and executing your inaugural call.&lt;/p&gt;
&lt;p&gt;Start by entering a Python virtual environment.&lt;/p&gt;
&lt;p&gt;Within your virtual environment, install setuptools, a prerequisite for the API library.&lt;/p&gt;
&lt;p&gt;Install the library using pip by typing this command:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install google-ads
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The library includes extensive example code deserving easy access. Cloning the API library Git repository directly into your home directory proves helpful:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone git@github.com:googleads/google-ads-python.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Navigate into the library and execute the setup test to verify proper installation:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python setup.py test
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;theres-one-last-credential-we-need-to-get&#34;&gt;There&amp;rsquo;s One Last Credential We Need to Get&lt;/h2&gt;
&lt;p&gt;Yes, there&amp;rsquo;s another credential required. Consider this comprehensive authentication process as a competitive barrier. The final credential — a refresh token — allows refreshing your credentials upon expiration.&lt;/p&gt;
&lt;p&gt;Navigate to the google-ads-python directory created during repository cloning, then proceed to the examples/authentication folder:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd examples/authentication
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Three files reside in this directory. The target file is authenticate_in_standalone_application.py. Execute it, specifying your previously downloaded JSON file location. Type this command (substituting /path/to/secrets.json with your actual file path and name):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./authenticate_in_standalone_application.py --client_secrets_path=/path/to/secrets.json
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This script generates a URL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Launch a private or incognito browser session.&lt;/strong&gt; This URL carries sensitive information — you shouldn&amp;rsquo;t preserve it in your browser history. Transfer the URL into your private browser session.&lt;/p&gt;
&lt;p&gt;Select &lt;strong&gt;allow&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;An authorization code becomes visible.&lt;/p&gt;
&lt;p&gt;Transfer the verification code to your command line session running authenticate_in_standalone_application.py and press enter:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;After approving the token enter the authorization code here: ****
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Upon successful entry:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;After approving the token enter the authorization code here: ****
Your refresh token is: ****
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Document this refresh token in an accessible location.&lt;/p&gt;
&lt;h2 id=&#34;rounding-up-all-your-credentials-and-getting-them-configured&#34;&gt;Rounding Up All Your Credentials and Getting Them Configured&lt;/h2&gt;
&lt;p&gt;You should now possess a collection of credentials stored somewhere accessible. Time to implement them.&lt;/p&gt;
&lt;p&gt;By default, the Google Ads API searches for credentials in a YAML file within the home directory labeled google-ads.yaml. This file resides within your cloned google-ads-python directory from GitHub. Your tasks involve:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Duplicate the YAML file&lt;/li&gt;
&lt;li&gt;Relocate it to your home directory&lt;/li&gt;
&lt;li&gt;Populate it with all credentials you&amp;rsquo;ve accumulated&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After transferring the file to your home directory, modify it with your appropriate information and save it.&lt;/p&gt;
&lt;h2 id=&#34;make-your-first-api-call&#34;&gt;Make Your First API Call!&lt;/h2&gt;
&lt;p&gt;Finally, the moment arrives. Execute an API call retrieving the name of your test account campaign.&lt;/p&gt;
&lt;p&gt;First, navigate to the relevant example script:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd google-ads-python/examples/basic_operations
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Execute get_campaigns.py, providing your test account number as an argument:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python get_campaigns.py -c1234567890
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Observe how the account ID transfers without spacing or dashes. Assuming correct configuration, you&amp;rsquo;ll receive output resembling:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Campaign with ID xxxxxxxxxxx and name &amp;#34;Campaign-Name-1&amp;#34; was found.
&lt;/code&gt;&lt;/pre&gt;</content>
    </item>
    
    <item>
      <title>Scraping TripAdvisor reviews using Python</title>
      <link>/posts/scraping-tripadvisor-reviews-using-python/</link>
      <pubDate>Mon, 19 Feb 2024 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/posts/scraping-tripadvisor-reviews-using-python/</guid>
      <description>&lt;p&gt;We&amp;rsquo;re going to use scrape review data from Tripadvisor, which would be helpful if you wanted to do a NLP analysis of reviews as a way to keep your finger on the pulse of customer satisfaction.&lt;/p&gt;
&lt;p&gt;Selenium is a tool that lets you control your desktop browser programmatically. Tripadvisor requires a &amp;ldquo;read more&amp;rdquo; button to be clicked to reveal the entire review, and Selenium is a good tool to easily get this done.&lt;/p&gt;</description>
      <content>&lt;p&gt;We&amp;rsquo;re going to use scrape review data from Tripadvisor, which would be helpful if you wanted to do a NLP analysis of reviews as a way to keep your finger on the pulse of customer satisfaction.&lt;/p&gt;
&lt;p&gt;Selenium is a tool that lets you control your desktop browser programmatically. Tripadvisor requires a &amp;ldquo;read more&amp;rdquo; button to be clicked to reveal the entire review, and Selenium is a good tool to easily get this done.&lt;/p&gt;
&lt;h2 id=&#34;install-selenium&#34;&gt;Install Selenium&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ll assume you&amp;rsquo;re using Anaconda for environment management. First, activate an environment with&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;conda activate [environment]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Install Selenium with:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;conda install -c conda-forge selenium
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;import-packages&#34;&gt;Import packages&lt;/h2&gt;
&lt;p&gt;The first thing we&amp;rsquo;ll do is import the required packages. There aren&amp;rsquo;t many:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; csv &lt;span style=&#34;color:#75715e&#34;&gt;#This package lets us save data to a csv file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; selenium &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; webdriver &lt;span style=&#34;color:#75715e&#34;&gt;#The Selenium package we&amp;#39;ll need&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; time &lt;span style=&#34;color:#75715e&#34;&gt;#This package lets us pause execution for a bit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;define-variables&#34;&gt;Define variables&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ll need to set up some variables.&lt;/p&gt;
&lt;p&gt;First, define a path and file to store data. Here I&amp;rsquo;m just putting it on my Mac&amp;rsquo;s desktop&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;path_to_file &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/Users/chris/Desktop/HotelReviews.csv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, define the number of review pages to scrape. There might be hundreds of pages of reviews, depending on the property. For this demonstration we&amp;rsquo;ll keep it easy and just grab three pages.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pages_to_scrape &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, define the Tripadvisor URL. We&amp;rsquo;ll use the Hilton Waikiki resort page, because it&amp;rsquo;s a super nice hotel!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.tripadvisor.com/Hotel_Review-g60982-d209422-Reviews-Hilton_Waikiki_Beach-Honolulu_Oahu_Hawaii.html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;get-selenium-on-the-right-page-and-set-up-the-csv&#34;&gt;Get Selenium on the right page and set up the CSV&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s launch Selenium and have it point the browser to the URL we&amp;rsquo;re using. This example uses the Safari browser, but you can remote control Chrome (or any other browser) if you prefer.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# import the webdriver&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;driver &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; webdriver&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Safari()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;driver&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(url)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We&amp;rsquo;ll also get a CSV set up to contain the data we retrieve&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# open the file to save the review&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;csvFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(path_to_file, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;csvWriter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; csv&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;writer(csvFile)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;programmatically-grab-the-reviews-one-after-the-other&#34;&gt;Programmatically grab the reviews, one after the other&lt;/h2&gt;
&lt;p&gt;Now it&amp;rsquo;s time to tell Selenium to grab the reviews. Because Tripadvisor reviews are truncated, we&amp;rsquo;ll be sure and click the &amp;ldquo;read more&amp;rdquo; button for all reviews first.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# change the value inside the range to save the number of reviews we&amp;#39;re going to grab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, pages_to_scrape):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# give the DOM time to load&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    time&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sleep(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Click the &amp;#34;expand review&amp;#34; link to reveal the entire review.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    driver&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;find_element_by_xpath(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.//div[contains(@data-test-target, &amp;#39;expand-review&amp;#39;)]&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;click()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Now we&amp;#39;ll ask Selenium to look for elements in the page and save them to a variable. First lets define a  container that will hold all the reviews on the page. In a moment we&amp;#39;ll parse these and save them:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    container &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; driver&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;find_elements_by_xpath(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;//div[@data-reviewid]&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Next we&amp;#39;ll grab the date of the review:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dates &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; driver&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;find_elements_by_xpath(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.//div[@class=&amp;#39;_2fxQ4TOx&amp;#39;]&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;# Now we&amp;#39;ll look at the reviews in the container and parse them out&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; j &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(len(container)): &lt;span style=&#34;color:#75715e&#34;&gt;# A loop defined by the number of reviews&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# Grab the rating&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        rating &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; container[j]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;find_element_by_xpath(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.//span[contains(@class, &amp;#39;ui_bubble_rating bubble_&amp;#39;)]&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_attribute(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;class&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_&amp;#34;&lt;/span&gt;)[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# Grab the title&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        title &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; container[j]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;find_element_by_xpath(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.//div[contains(@data-test-target, &amp;#39;review-title&amp;#39;)]&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#Grab the review&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        review &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; container[j]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;find_element_by_xpath(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.//q[@class=&amp;#39;IRsGHoPm&amp;#39;]&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;  &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#Grab the data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        date &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(dates[j]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)[&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;:])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#Save that data in the csv and then continue to process the next review&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        csvWriter&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;writerow([date, rating, title, review])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# When all the reviews in the container have been processed, change the page and repeat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    driver&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;find_element_by_xpath(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.//a[@class=&amp;#34;ui_button nav next primary &amp;#34;]&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;click()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# When all pages have been processed, quit the driver&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;driver&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;quit()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;s it! A very simple program. You&amp;rsquo;ll now have a csv that contains all the reviews you retrieved.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>About</title>
      <link>/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <author>cahoover@gmail.com (Christopher Hoover)</author>
      <guid>/about/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m Christopher Hoover. I write about behavioral psychology, marketing, leadership, and technology.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m also building &lt;a href=&#34;/projects/&#34;&gt;Research Tool&lt;/a&gt;, an analytics platform that helps analysts figure out what changed, why it matters, and what happened next — with evidence they can inspect.&lt;/p&gt;
&lt;p&gt;Feel free to &lt;a href=&#34;/&#34;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;</description>
      <content>&lt;p&gt;I&amp;rsquo;m Christopher Hoover. I write about behavioral psychology, marketing, leadership, and technology.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m also building &lt;a href=&#34;/projects/&#34;&gt;Research Tool&lt;/a&gt;, an analytics platform that helps analysts figure out what changed, why it matters, and what happened next — with evidence they can inspect.&lt;/p&gt;
&lt;p&gt;Feel free to &lt;a href=&#34;/&#34;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
