OnceHub | Blog https://www.oncehub.com/blog Keep up to date with news, updates and tips from OnceHub Tue, 07 Apr 2020 10:34:43 +0000 en-US hourly 1 https://wordpress.org/?v=5.4 What is TDD? https://www.oncehub.com/blog/what-is-tdd/ https://www.oncehub.com/blog/what-is-tdd/#respond Fri, 03 Apr 2020 08:08:36 +0000 https://www.oncehub.com/blog/?p=4675 The internet is full of arguments about whether TDD is a good practice, a required practice, or a bad practice. When looking at these arguments, it becomes clear that there is no real shared meaning of what TDD actually is. Each blog post defines TDD in its own way and has its own claim of […]

The post What is TDD? appeared first on OnceHub | Blog.

]]>
The internet is full of arguments about whether TDD is a good practice, a required practice, or a bad practice. When looking at these arguments, it becomes clear that there is no real shared meaning of what TDD actually is. Each blog post defines TDD in its own way and has its own claim of what TDD promises. The following is a fun exploration of what TDD means and what it doesn’t, with no claims to having a definitive answer.

Test-Driven Development
That’s what it says on the tin, but what does that mean?

Test-Driven Design!
Sure, ok. The tests inform the direction of the design. But you still need good design skills. So what’s TDD?

Tests Drive Design!
Now you’re just repeating yourself. You need a strong grasp of good design ahead of time, to make sure the tests drive you in the right direction.

Testable Domain Decisions!
Huh? Are you saying that TDD is about declaring decisions that are made in a domain and making them testable? Umm, I guess?

Test Desideratum Declared!
Did you use a dictionary for that? No, just Kent Beck? Fine, whatever. Completely meaningless though.

Ok, now you’re just spitting out random words.

Think, Design, Develop!
Really? That’s TDD? I thought TDD was all about writing tests first, not that other stuff… 

Theory Distracts Delivery
Your random words are becoming obnoxious. Does anything mean anything any more?

Time Determines Decoupling
Oh boy, I think you’re losing it!

Three Daring Disciplines!
Are you talking about those three laws? Meh!

Time, Databases, Dependencies
What?! Those are the very things that make TDD so difficult!

Terminate Deranged Digressions
That’s it! It’s obvious no one really knows what TDD is. Everyone has their own definitions. Their own insistence that it’s not TDD if you don’t do X, or Y. If you design all your tests up-front, i.e. write a schematic, does that count as TDD? Some will say yes, others will say no.

Enough silliness. Let’s ditch the labels and get to the essence of things.

Unpacking TDD

First, there are the three laws of TDD.

Law 1: You are not allowed to write any production code unless it is to make a failing unit test pass.

Law 2: You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.

Law 3: You are not allowed to write any more production code than is sufficient to pass the one failing unit test

– Uncle Bob Martin

So, looking at these three laws, what do we learn?

There is a fast feedback loop. We can’t write much code before one of those laws moves us onto the next one.  Ok, so if there isn’t a fast feedback loop, it’s not TDD?

Well, maybe it’s TDD, but it’s not TDD that will be helpful in the long term. Eventually, the team will tire of it and move on to something with better dopamine hits and less discipline.

Ok, then we have the 3 phases of TDD, which seemingly, don’t correspond to the 3 laws.

  1. Red – Write a failing test first
  2. Green – Get that test to pass
  3. Refactor – Clean up the code, fix the design flaws, make the tests more specific and the code more generic.

Right, let’s unpack those.

We need a failing test to test our test. We need to know before we start moving forward that we know what we’re looking for.

Make the tests pass: that’s easy and obvious. Guess it’s just there for sake of completeness.

Refactor? What? Why? What’s refactor doing there?

Really? It’s the most important part of the whole TDD experience? The Red and Green are just there to make the Refactoring part safe? Then why does everyone only talk about green passing tests and red failing tests? I thought refactoring was only for legacy code, i.e. code without tests!

Yeah, I don’t know why Refactoring gets the short stick. It really is the second most important aspect of TDD.  
So what’s the most important part of TDD?

Before you start your journey, know where you’re headed. The most important aspect of TDD is being able to break down the goal into the next simplest and easiest step that will yield the greatest amount of knowledge. This is what’s so hard. Lack of knowledge makes tests so brittle and fragile.  

How do you know if you know where you are headed? Because the next tests are easy to write and think about. If the next test isn’t easy, you aren’t headed on the right path.

Obviously, that doesn’t mean all tests are easy to write. If they were all easy, you could go in any order. But each step becomes easier as you choose the next easiest step to get you closer. As the system gets built up, as the code becomes more generic, and the tests become more specific, your gut tells you where the next easiest test will be. And this is what they mean when they say that TDD is really all about the emergent design.

TDD lets you think with your whole self, from your analytical mind to your reptilian brain. To the hard analysis, figuring out where you want to go, and reasoning about the next smallest step that takes you there. Then allow your reptilian brain to give you the gut reaction, verifying that you’re headed in the right direction. If your gut says no, engage the analytical mind and find the right step. You can’t start your journey until you know where you’re going, and you can’t write any code until you know how to test it.

Ditch the labels, ditch the ceremony, but start with a Test as you Discover the next step towards your Destination. 😉


Avi Kessner, Software Architect

Avi started as a Flash Animator in 1999, moving into programming as Action Script evolved. He’s worked as a Software Architect at OnceHub since September 2019, where he focuses on Cloud Native Automated workflows and improving team practices. In his free time, he enjoys playing games, Dungeons & Dragons, Brazilian jujitsu, and historical European sword fighting.

The post What is TDD? appeared first on OnceHub | Blog.

]]>
https://www.oncehub.com/blog/what-is-tdd/feed/ 0
Webinar replay: Lessons from 7 years of working from home https://www.oncehub.com/blog/lessons-from-7-years-of-working-from-home/ https://www.oncehub.com/blog/lessons-from-7-years-of-working-from-home/#respond Wed, 25 Mar 2020 09:50:00 +0000 https://www.oncehub.com/blog/?p=4623 COVID-19 is forcing many of us to transition our operations to working from home. To help you with this transition, our CEO, Rami Goraly, shares key insights and learnings from OnceHub’s working from home journey: from hiring our first employee in 2013 to our current state of over 150 employees, working across all five continents. […]

The post Webinar replay: Lessons from 7 years of working from home appeared first on OnceHub | Blog.

]]>
COVID-19 is forcing many of us to transition our operations to working from home. To help you with this transition, our CEO, Rami Goraly, shares key insights and learnings from OnceHub’s working from home journey: from hiring our first employee in 2013 to our current state of over 150 employees, working across all five continents. The webinar ends with an open Q&A session.

Watch it now:

The post Webinar replay: Lessons from 7 years of working from home appeared first on OnceHub | Blog.

]]>
https://www.oncehub.com/blog/lessons-from-7-years-of-working-from-home/feed/ 0
OnceHub coronavirus business continuity plans https://www.oncehub.com/blog/oncehub-coronavirus-business-continuity-plans/ https://www.oncehub.com/blog/oncehub-coronavirus-business-continuity-plans/#respond Fri, 13 Mar 2020 08:49:30 +0000 https://www.oncehub.com/blog/?p=4548 As the coronavirus continues to spread globally, we at OnceHub are taking various measures to protect the safety of our employees, and ensure that our services remain fully operational for all our customers and business partners. As a precautionary measure, we have activated our Business Continuity Plan, and we have set out below the key […]

The post OnceHub coronavirus business continuity plans appeared first on OnceHub | Blog.

]]>
As the coronavirus continues to spread globally, we at OnceHub are taking various measures to protect the safety of our employees, and ensure that our services remain fully operational for all our customers and business partners.

As a precautionary measure, we have activated our Business Continuity Plan, and we have set out below the key measures that we have implemented.

While the future remains uncertain, at the moment its business as usual.  We are continuing to monitor the situation and will respond further, if necessary, as the situation develops.

  • Our employees are based in multiple locations around the world. We use hosted cloud services to run all aspects of our business, including the delivery of our products to our customers. Our employees connect to our work environment using secure company laptops over secure connections. As such, we have a significant degree of resiliency and redundancy built into our operating business model.
  • Our employees in the USA, UK, Ireland, Israel, New Zealand, and South Africa all work from home on a normal basis.  We have managed offices available to our employees in India, and in response to the outbreak we have closed these, and instructed our Indian employees to work from home until further notice.
  • Our third-party vendors provide automated technical and infrastructure services to us. We have conducted a risk assessment, and are confident that the virus outbreak will not adversely impact their ability to deliver their services to us.
  • We are communicating with our employees on an ongoing basis, and advising them of the various measures and precautions that they should take to minimise the risk.
  • We have restricted non essential travel for all our employees.

Please do not hesitate to contact us if you have any questions or concerns.


Steve Smith, Director of IT, Risk & Data Protection

Steve is our Data Protection Officer and legal counsel. He leads our risk management and internal IT departments, and defines our compliance processes and policies. He has over two decades experience as a solicitor, an IT systems designer, and as a risk and data privacy professional in the legal and insurance sectors. Steve is a qualified solicitor, and is CRISC and IAPP/E certified. In his spare time he enjoys cycling, travel, and fine wine.

The post OnceHub coronavirus business continuity plans appeared first on OnceHub | Blog.

]]>
https://www.oncehub.com/blog/oncehub-coronavirus-business-continuity-plans/feed/ 0
Moving from functional to object-oriented programming https://www.oncehub.com/blog/moving-from-functional-to-object-oriented-programming/ https://www.oncehub.com/blog/moving-from-functional-to-object-oriented-programming/#respond Thu, 12 Mar 2020 21:22:24 +0000 https://www.oncehub.com/blog/?p=4410 Switching a programming language within the object-oriented world or the functional world is merely a change of using new syntax and new libraries that do the same thing. Although these two styles (object-oriented and functional programming) both accomplish the same thing by computation, the way they approach the problem requires a very different mindset. In […]

The post Moving from functional to object-oriented programming appeared first on OnceHub | Blog.

]]>
Switching a programming language within the object-oriented world or the functional world is merely a change of using new syntax and new libraries that do the same thing.

Although these two styles (object-oriented and functional programming) both accomplish the same thing by computation, the way they approach the problem requires a very different mindset. In order to be consistent and make our code manageable, we follow the mindset of whichever style in which we are coding.

Writing code that is easy to maintain is an art.

The problem

The problem arises when there is either a professional demand or personal choice to move from one mindset of programming to another. The codebase ends up with a mixture of functional and object-oriented code, which is complicated and costly to maintain. It is also difficult to develop a new feature in this case. At OnceHub we experienced this problem when we had some procedural/functional code in our supposedly object-oriented microservice.

That object-oriented microservice is in Ruby (Rails API), so the examples I will be using here will also be in Ruby, but the concepts are easily applicable to any object-oriented language (for example, TypeScript/Python).

We will not get into the concepts of object-oriented programming or how to write practical object-oriented code (for that we will have another blog post); rather, we will review the equivalent concepts and contrasts of functional programming in the object-oriented world.

Potential solution

The hardest part: Data and behavior together

Object-oriented world: 

  • Here we think about everything as if it is a real-world object and has some behavior. Now in technical terms, an object is nothing but a structure and its behavior is just the methods it has. But in functional programming, we have data and functions as different entities. So this is a major difference. 
  • In a good object-oriented world, every object does one thing and knows as little about other objects as possible, so there are few interdependencies among them. This is similar to having functions with no side effects in functional programming and depending only on their inputs, like a pure function. 
  • Objects’ main focus is on their behavior and not on data, so data is mutable, unlike immutable data in functional programming.

To highlight how different the approaches are in OOP and FP, I’ve borrowed this example below:

You run a company and you just decided to give all your employees a $10,000 raise. How would you tackle this situation programmatically?

In OOP:

  1. Create Employee class that initializes with name and salary, and has a change salary instance method
  2. Create instances of employees
  3. Use each method to change the salary attribute of employees by +10,000

In FP:

  1. Create employees array, which is an array of arrays with name and corresponding salary
  2. Create a change_salary function that returns a copy of a single employee with the salary field updated
  3. Create a change_salaries function that maps through the employee array and delegates the calculation of the new salary to change_salary
  4. Use both methods to create a new dataset, named ‘happier employees’

Now we have an idea about how these two are different, let’s see how to make our codebase more object-oriented from a mixed-style (OOP + FP) codebase. The following are some of the problems we faced and how we solved them.

Single Responsibility Principle

This sounds very easy but takes effort to implement. If you’re coming from a functional programming background, I am assuming that you know about it.

We had a class whose primary function was to send some data, which gets used for initializing components in a front-end service. Now as the functionality increased, we began to have more to initialize; one of which was to send a welcome message to that front-end service. The logic of calculating that required at least three good functions, which could also be used in other classes, like when making the JSON response. 

The test cases of this class were not fully testing the logic of making the initialized data. They just checked that the method was getting called and then partially compared the response, in which we didn’t check the welcome messages. It was done for one simple reason: the member function was doing a lot of things and no one wanted to touch it. Problems it created:

  • No test for actual logic of creating the initialize data because no one wanted to touch that big piece of code.
  • Very hard to change or add a new feature in that code.
  • Overall -> Very costly in development

How did we handle it?

We extracted out the code for making welcome messages in a helper class, and now we just include it wherever we want. This helper class only takes the current session object and builds welcome messages based on its properties. 

# Initial Code

class InitializeFrontEnd                 # Demo name
def initialize(config)
  @config = config
end

def setup_data
  collection = Message.find_by(website_id: @config.website_id, is_welcome: true)
  # more filtering and condition on result based on config data
  messages = collection.collect {|question| <some conditions> }
  .
  . # (some other things on which I am not going into details)
 
  # Making JSON
  response = {
    welcome_messages: messages
    .
    .
  }
  render response
end

.
.
.
other methods
.
.
end

# After refactoring

class InitializeFrontEnd
include WelcomeMessage

def initialize(config)
  @config = config
  @welcome = WelcomeMessage.new(@config.current_session)
end

def setup_data
  response = {
    welcome_messages: @welcome.messages
  }
  render response
end
end

After this refactoring, we did introduce a dependency in our InitializedFrontEnd class, but we are fine with this tradeoff, as now the tests are easy and the heavy logic is lifted into a helper class that can have separate tests. 

Remember that a class should do the smallest possible useful thing. That thing ought to be simple to describe. If the simplest description you can devise uses the word “and”, the class likely has more than one responsibility. If it uses the word “or”, then the class has more than one responsibility and they aren’t even very related. — Sandi Metz

Complex Data Structure

Depending on a complex data structure is worse. It is very hard for anyone to understand it and how to make a change in it. 

What is a complex data structure, you ask? Well, imagine we are taking an array of arrays as a parameter in a constructor of a class in a data variable called `data` and then using that like this, “data[0][1]”, in different methods of a class.

Direct references into complicated structures are confusing, because they obscure what the data really is, and they are a maintenance nightmare because every reference will need to be changed when the structure of the array changes.

Example: Consider a class Departmental Store that takes data as an argument in its constructor. This data is an array of arrays having the cost price of an item at the 0th index and tax on that item at the 1st index. 

(Here we are not taking the actual example of our microservice, as that is very complex)

# Initial Code

class Store
attr_reader :data
  def initialize(data)
  @data = data
end

def selling_prices
  data.collect{ |item| item[0] + item[1] }
end
end

# After refactoring

class Store
attr_reader :items

def initialize(data)
  @items = make_items(data)
end

def prices
  items.collect { |item| item.cost_price + item.tax}
end

Item = Struct.new(:cost_price, :tax)
def make_items(data)
  data.collect {|cell| Item.new(cell[0], cell[1]) }
end
end

The takeaway is ->

If you are compelled to take complex structure as input, then hide the mess even for yourself. 

Writing loosely coupled code

Every new class reference inside a class makes it dependent on the referenced class. The more we have it, the less it is available for reuse. 

We used to have methods in our classes that directly referred to another class. The problem with this is that we are hard coding a behavior to a specific kind of object. Rather, it is possible that other objects may also possess that behavior, and in that case, our class should work.

For example: Consider the InitializeFrontEndclass that generates a bill. Now it should be able to generate a bill of an item purchased or for a service taken by the customer.

If we have our Bill class like this: 

class Bill
attr_reader :price, :tax

def initialize(price, tax)
  @price = price
  @tax = tax
end

def generate
  total = Item.new(price, tax).market_value   # Only works for Item class
  “$ #{total}”
end
end

Even if there will be other classes like a `Service` class that will respond to `market_value` behavior, we are not able to use Bill#generate behavior for that. Thus, our object is not reusable. 

Instead, look at the following code:

class Bill
attr_reader :price, :tax, :any_service

def initialize(price, tax, any_service)
  @price = price
  @tax = tax
  @any_service = any_service
end

def generate
  total = any_service.market_value
  “$ #{total}”
end
end

We inject our dependency and expect to respond to `market_value` behavior in the “generate” function. 

The takeaway is ->

One object should not know much about any other objects/classes. Give it something and expect some behavior out of it. 

In the second part, we will look at creating flexible interfaces, reducing cost with duck typing, and cost-effective testing. 

These are the principles we are including in our daily development at OnceHub. To find more content like this, you can also follow my personal blog.

Happy growing. 🙂


Raounak Sharma, Full Stack Developer

Raounak loves helping a business grow through his technical contributions, working with startups and multi-national corporations. He enjoys the challenge of maintaining quality in software, especially as the industry changes with every market trend. He’s worked as a Full Stack Developer at OnceHub since July 2019. In his free time, he plays football for clubs in Delhi, India and loves trekking, listening to audiobooks while doing cardio, and watching stand-up comedy. 

The post Moving from functional to object-oriented programming appeared first on OnceHub | Blog.

]]>
https://www.oncehub.com/blog/moving-from-functional-to-object-oriented-programming/feed/ 0
Lagging behind to stay ahead: What engineering taught us about staying healthy https://www.oncehub.com/blog/lagging-behind-to-stay-ahead-what-engineering-taught-us-about-staying-healthy/ https://www.oncehub.com/blog/lagging-behind-to-stay-ahead-what-engineering-taught-us-about-staying-healthy/#respond Fri, 28 Feb 2020 01:18:00 +0000 https://www.oncehub.com/blog/?p=4407 First, a little background. Here at OnceHub, we have amazing opportunities as employees. One of those opportunities is that we can work from home. Having employees working from home from California to New Zealand has certainly helped us understand scheduling needs, but it has also taught us the importance of taking extra effort to stay […]

The post Lagging behind to stay ahead: What engineering taught us about staying healthy appeared first on OnceHub | Blog.

]]>
First, a little background. Here at OnceHub, we have amazing opportunities as employees. One of those opportunities is that we can work from home. Having employees working from home from California to New Zealand has certainly helped us understand scheduling needs, but it has also taught us the importance of taking extra effort to stay in shape.

A group of us at OnceHub have started an initiative called StepOnce.  Using the gifts we were given at our company retreats, we encourage each other to take those 10,000 steps, or 60 ‘move minutes’ every day to stay healthy. But something very surprising happened. From our training in Site Reliability Engineering, we learned something else that helps us improve our health.

Leading vs Lagging Indicators

When measuring telemetry to best understand our system and keep our services up and running, there are two meta-categories we can use to keep everything running smooth. The first category is called ‘Leading Indicators’. These are events or metrics that give us a clue about what we can expect in the future. For example, if the number of requests per second starts going up, we can expect that we will need to scale up a service. We might deploy another pod in kubernetes to ensure that any future request does not experience service interruption. 

Another meta-category of telemetry is called ‘Lagging Indicators.’ These are events or metrics that tell us about things that actually happened. Prediction is great, but reality is better. An example of a lagging indicator might be a metric known as ‘Mean time to recovery’(MTTR). MTTR is the measurement of how long it took us to recover from a degradation in service, be it slower response times or an actual outage. These lagging indicators give us an honest look at how well we performed and our goal is to make sure those lagging indicators head in the right direction.

When it comes to site reliability, we want to measure both leading and lagging indicators. Mostly, we want to focus on leading indicators, to better predict the future. It’s always better if a problem is avoided rather than congratulating ourselves on how quickly we fixed a problem. However, as more systems become automated, and we increase our rate of improvement, inevitably, problems will increase. Because of this, many in the DevOps community put extra focus on tracking and learning from lagging indicators.

In a talk about telemetry, Roy Osherove explained the importance of lagging indicators with the following example. Say you are trying to lose weight. You can attempt to measure the amount of calories you eat, and the amount of calories you burn, and this will give you a good indication of your ability to lose weight. It can even be very predictive. Theoretically, you are also in complete control. However, as life becomes more chaotic and the system more complex, these leading indicators also become harder and less realistic to manage. Restaurants will add extra fat or sugar. A family event will pressure you into eating lots of food. 

However, the lagging indicators will always be honest with you. At the end of the day, you put yourself on the scale and know how much weight you lost or gained. If every day you measure your weight, and perform a retrospective, then even though you may not have as much control over your leading indicators as you would like, you can help nudge your lagging indicators in the right direction.

The lesson for system operators is clear. As we have more and more microservices, and as systems become more complex, it becomes harder to properly measure and even control all the leading indicators in the system. But you can easily measure your lagging indicators, and watch them, and if you have frequent retrospectives, you can also learn from them. 

Sounds good on paper, but is this really true? Lagging indicators can take a long time to measure and learn from, so this can be risky. It might take months to find out if you are headed in the right direction or not. It doesn’t sound very Agile or Lean.

Putting Theory in Practice

Various experts on weight loss will advise that it isn’t very good to weigh yourself everyday. The body can fluctuate day to day by a few pounds or kilograms. When we dig deeper, we see that the reason for this advice is that it can be demoralizing. However, if we look at weight as a lagging indicator, and engage in personal retrospectives, then in theory it will be more effective than counting steps and keeping to a strict diet/lifestyle.

For months, I worked on strict meal plans, took up Brazilian Jiu Jitsu, and Longsword dueling to stay active, and managed to walk about 5,000 steps every day. Every two months I would weigh myself, and my doctor was happy with the results. But I wasn’t. As an experiment, I incorporated the lessons of leading and lagging indicators, weighing myself every day, and doing a quick mental accounting of what I did that day that was either the same or different from other days. At first this was hard, because it’s hard to confront ourselves when our actions don’t live up to what we wanted to do, but eventually I got into a nice rhythm.

Two months later the results have really surprised me. By measuring my weight every day, and thinking about my previous day’s actions, I was able to start subconsciously regulating what I ate that day. I found that on days where my weight spiked up, the next day or two I tended to be less hungry. There have also been conscious differences in my behaviour. My intuition about how the leading indicators affects the lagging indicator is much stronger, and I can make better decisions during the day with that knowledge.

What you measure, how often you measure it, and thinking about why the measurements changed can have a bigger impact on decision making and behavior than just trying to control traditional leading indicators. Be sure to measure your lagging indicators and engage in regular retrospectives. If you stay behind to measure results, it will eventually pull you ahead.

If you would like to join us in your own journey moving ahead, see our Careers page.


Avi Kessner, Software Architect

Avi started as a Flash Animator in 1999, moving into programming as Action Script evolved. He’s worked as a Software Architect at OnceHub since September 2019, where he focuses on Cloud Native Automated workflows and improving team practices. In his free time, he enjoys playing games, Dungeons & Dragons, Brazilian jujitsu, and historical European sword fighting. 

The post Lagging behind to stay ahead: What engineering taught us about staying healthy appeared first on OnceHub | Blog.

]]>
https://www.oncehub.com/blog/lagging-behind-to-stay-ahead-what-engineering-taught-us-about-staying-healthy/feed/ 0
Webinar replay: 3 ways to be more productive with OnceHub for Gmail https://www.oncehub.com/blog/webinar-3-ways-to-be-more-productive-with-oncehub-for-gmail/ https://www.oncehub.com/blog/webinar-3-ways-to-be-more-productive-with-oncehub-for-gmail/#respond Wed, 15 Jan 2020 18:02:00 +0000 https://blog.oncehub.com/?p=4068 Learn how our new Chrome extension, OnceHub for Gmail, can optimize your productivity. You’ll discover the best ways to share your scheduling links without leaving Gmail, straight from our CEO, Rami Goraly. He’ll discuss best practices and provide a hands-on demo.  Want to learn more? Read our post about best practices using OnceHub for Gmail.

The post Webinar replay: 3 ways to be more productive with OnceHub for Gmail appeared first on OnceHub | Blog.

]]>
.et_post_meta_wrapper img { display:none; }

Learn how our new Chrome extension, OnceHub for Gmail, can optimize your productivity. You’ll discover the best ways to share your scheduling links without leaving Gmail, straight from our CEO, Rami Goraly. He’ll discuss best practices and provide a hands-on demo. 

Want to learn more? 
Read our post about best practices using OnceHub for Gmail.

The post Webinar replay: 3 ways to be more productive with OnceHub for Gmail appeared first on OnceHub | Blog.

]]>
https://www.oncehub.com/blog/webinar-3-ways-to-be-more-productive-with-oncehub-for-gmail/feed/ 0
Version 9.6 is live: Share scheduling links without leaving Gmail https://www.oncehub.com/blog/version-9-6-is-live-share-scheduling-links-without-leaving-gmail/ https://www.oncehub.com/blog/version-9-6-is-live-share-scheduling-links-without-leaving-gmail/#comments Thu, 09 Jan 2020 20:21:55 +0000 https://blog.oncehub.com/?p=4001 Happy new year! We’re starting off 2020 with our latest release, OnceHub 9.6.  The main highlight is our new Chrome extension, OnceHub for Gmail. After a quick installation, you’ll be able to share your scheduling links without leaving your inbox.  You can minimize breaks in your workflow, saving time and effort as you share your […]

The post Version 9.6 is live: Share scheduling links without leaving Gmail appeared first on OnceHub | Blog.

]]>
Happy new year! We’re starting off 2020 with our latest release, OnceHub 9.6. 

The main highlight is our new Chrome extension, OnceHub for Gmail. After a quick installation, you’ll be able to share your scheduling links without leaving your inbox. 

You can minimize breaks in your workflow, saving time and effort as you share your scheduling links with customers. Whether you want to provide the standard generic link, a one-time link, or a personalized link, you can copy and paste it into your email in seconds, without shuffling through browser tabs. 

You can install OnceHub for Gmail from the Chrome Web Store.  

OnceHub for Gmail key features:

  • Instant access to your booking page links
  • Automatically personalize your links
  • Easily generate one-time links
  • Complete harmony with your inbox and contacts
  • Google approved and secure

For an in-depth look, you can check out our blog post on best practices using OnceHub for Gmail.

Webinar: 3 ways to be more productive with OnceHub for Gmail
OnceHub’s CEO, Rami Goraly, will present the three ways in which OnceHub for Gmail can be used to increase your productivity when inviting your customers to schedule. Join us on Thursday, January 16 @ 2PM (US Eastern time).

Register for the webinar

You may not notice the other additions to the OnceHub 9.6 release, because they’ll work quietly in the background, improving performance and stability. Users on the customer side also gain further accessibility enhancements for the vision-impaired, as part of our commitment to provide everyone with a first-class scheduling experience.

To learn more about OnceHub 9.6 and how you can use the new extension, see the What’s new in version 9.6? article and the new OnceHub for Gmail category in our support center. 

As always, if you have any questions or feedback, we would love to hear it. You can add a comment to this post or use our Contact page.

The post Version 9.6 is live: Share scheduling links without leaving Gmail appeared first on OnceHub | Blog.

]]>
https://www.oncehub.com/blog/version-9-6-is-live-share-scheduling-links-without-leaving-gmail/feed/ 7
Best practices using our OnceHub for Gmail extension https://www.oncehub.com/blog/best-practices-using-our-oncehub-for-gmail-extension/ https://www.oncehub.com/blog/best-practices-using-our-oncehub-for-gmail-extension/#respond Thu, 09 Jan 2020 20:21:32 +0000 https://blog.oncehub.com/?p=4005 In our recent release, we introduced OnceHub for Gmail, our Chrome extension. If you haven’t seen the video yet, check it out: You’re writing an email to a contact and want them to book with you. Okay, it’s time to grab your scheduling link. Do you have it saved somewhere? You memorized it and you’re […]

The post Best practices using our OnceHub for Gmail extension appeared first on OnceHub | Blog.

]]>
In our recent release, we introduced OnceHub for Gmail, our Chrome extension. If you haven’t seen the video yet, check it out:


You’re writing an email to a contact and want them to book with you. Okay, it’s time to grab your scheduling link. Do you have it saved somewhere? You memorized it and you’re typing out the whole URL? Do you have to go to OnceHub to grab the right link? 

If you want to personalize that link so your customer can schedule immediately, without typing their name and email into a form, do you remember the correct URL syntax to add that personalization? 

If you want to ensure your customer can only use the link once, how long does it take you to switch to OnceHub, find the right page, and create a one-time link? 

We often find that users shuffle through different tabs and pages to grab the right link, breaking their workflow and lowering their productivity, when they could be grabbing the link in seconds, without ever leaving their inbox. You can use the OnceHub for Gmail extension to manage any of these scenarios in seconds, without switching tabs.  

After you install the extension on the Chrome browser, you’ll have everything within easy reach inside Gmail. You can continue your workflow uninterrupted with all the tools you need to grab meeting links, whether your meeting requires a generic, personalized, or one-time link.  

Let’s take a closer look at the multiple ways you can advance your productivity and preserve your workflow by using OnceHub for Gmail. 

Using generic links

If you wish to send your customer a generic link, you can grab it straight from the extension. If you have many links in your OnceHub account, use the search bar to find the right one. 

You can provide the link as-is or use Google’s ‘Insert link’ tool on the compose toolbar to provide your customer with a strong and visible call to action, using your own words. 

Use Gmail’s ‘Insert link’ tool for a strong call to action

Personalize your links

Raise your conversion rates by using personalized links, which allow your customers to schedule immediately, without needing to fill out the booking form. Since you already have their name and email, there’s no need to waste their time asking again. This removes the tedious barrier of filling out yet another form before they commit to a booking. After clicking your personalized link, all they need to do is select the time that works for them and hit schedule, and it’s in both your calendars. 

No form required: Your customers select a time and schedule immediately.

You’ll find grabbing a personalized link especially easy with the OnceHub for Gmail extension. If you’re already writing a new email or responding to a contact, the extension detects their name and email from the ‘To:’ field on that open email. When you click the Personalized icon, it adds their name and email dynamically to that link. You’ve grabbed your personalized link with no further effort required. 

Limit your customer to one booking only

If you’d like to control the booking process further and eliminate any chance of unwanted, repeat bookings from your customer, one-time links ensure your customer can only book once. You’ll send your customer a link that doesn’t reveal your underlying booking page link. Instead, their URL shows an eight-digit code provided for that intended booking.

If they attempt to access the page again after booking with you, they will see a notice advising them the link is no longer valid. 

If you like, you can also make the one-time link a personalized link. 

Your customer can only use the provided link once.

Protect your workflow and remove temptations

We’re all told the best way to stay productive is to focus on one prioritized matter at a time, eliminating distractions. Every second lost has potential to derail your day and the time away from your primary tasks can stretch exponentially. 

We know how busy days can get and how difficult focusing can be, especially when your work is piling up behind you. With OnceHub for Gmail, you don’t need to stray from your inbox when you share your scheduling links. After you install our extension through the Chrome Web Store, it’ll all be at your fingertips in seconds. 

Workflow: maintained. Internet temptations: ignored. High five!

As always, we’d love to hear from you about this new feature, how you use it, and what you’d like to see next. Reply to this blog post or contact us at: support@oncehub.com.  

The post Best practices using our OnceHub for Gmail extension appeared first on OnceHub | Blog.

]]>
https://www.oncehub.com/blog/best-practices-using-our-oncehub-for-gmail-extension/feed/ 0
How We Fell Victim To Card Testing Fraud https://www.oncehub.com/blog/how-we-fell-victim-to-card-testing-fraud/ https://www.oncehub.com/blog/how-we-fell-victim-to-card-testing-fraud/#respond Fri, 20 Dec 2019 13:22:32 +0000 https://blog.oncehub.com/?p=3925 The last three weeks have been hectic for our company. Credit card testing fraud has hit us hard. This post is the third on this subject, following the first post by our Trust and Data protection officer and the second post made by me. In this post, I would like to take a step back […]

The post How We Fell Victim To Card Testing Fraud appeared first on OnceHub | Blog.

]]>
The last three weeks have been hectic for our company. Credit card testing fraud has hit us hard. This post is the third on this subject, following the first post by our Trust and Data protection officer and the second post made by me. In this post, I would like to take a step back and explore the larger context of what happened and what we learned from it.

We design our product for the good guys: people who want to eliminate the back-and-forth when scheduling meetings with people outside their organization. We put a lot of thought and effort into creating a great product for the good guys. Unfortunately, it turns out there are also bad guys who want to use our product for illegal purposes, as another piece in their crime chain.

Why would anyone purchase OnceHub SMS credits with a stolen card? Well, if they can do this on a large scale, with thousands of bots all around the world, they can create a card-testing machine that tells them which of the cards they stole or purchased on the dark web were already blocked and which are still usable for their fraudulent schemes. They can do this on a large scale, filtering out the blocked cards and keeping the validated cards, which they can then resell, use at ATMs, or use to purchase physical goods.

The attack started with the fraudsters creating one account and using it to make multiple purchases. We managed to detect this pretty quickly and blocked the account. We then refunded and voided all the transactions.

Then the fraudsters started with the second phase of their attack, creating multiple accounts and using them for multiple purchases. We responded as we did before and started to deploy additional measures to curb the attackers.

They carried out the third phase of their attack with innocent-looking accounts, some of which they may have prepared in advance. Every such account had one purchase only and everything looked legitimate. It was very hard to tell the difference between a real customer and a fraudster account. We again responded and deployed additional measures. However, this only slowed them down for a while and they kept coming back, bypassing the measures we implemented and the expensive bot-detection software meant to block this kind of attack. These fraudsters had the complete details of all their cards. See this article to understand how they steal this information.

At that point, we decided to take down purchasing via credit cards. We knew this would be another blow to our business but it was the right thing to do.

We have a high focus on security and privacy in OnceHub, ensuring our customers’ data is safe. However, we did not conceive that someone would want to use our software for an illegal activity on such a large scale. This incident taught us that the threat from illegal use of our software is just as crucial and its mitigation should be an integral part of our product development lifecycle process.

Another takeaway from this incident is never to underestimate the power of fraudsters and how sophisticated and determined they can be. Credit card fraud is a multi-billion dollar industry. In August this year, over five million cards were breached from a supermarket chain. In November, over four million credit cards were obtained from breaches involving a chain of restaurants. Just yesterday, a large convenience store chain announced its cards were compromised over a nine-month period. We empathize with all the innocent cardholders whose details were compromised as a result of these attacks.

As I mentioned at the start of this post, the last three weeks have been tough on us. They required all we had: commitment, resourcefulness, perseverance, initiative, and leadership. We are proud of our team members, who stepped up and demonstrated these values, working together around the clock to fight this massive attack. Yes, we have been hurt, but we will prevail. We are coming out of this a stronger, smarter, and more resilient company.

The post How We Fell Victim To Card Testing Fraud appeared first on OnceHub | Blog.

]]>
https://www.oncehub.com/blog/how-we-fell-victim-to-card-testing-fraud/feed/ 0
Card Testing Fraud – Continued https://www.oncehub.com/blog/credit-card-testing-fraud-continued/ https://www.oncehub.com/blog/credit-card-testing-fraud-continued/#comments Mon, 16 Dec 2019 19:30:57 +0000 https://blog.oncehub.com/?p=3904 If you are a OnceHub customer trying to pay for your account, read below to learn why we have temporarily suspended payment via credit cards. If you are not a OnceHub customer and see a charge from OnceHub on your credit card statement, your card details were stolen from another merchant and were used by […]

The post Card Testing Fraud – Continued appeared first on OnceHub | Blog.

]]>
If you are a OnceHub customer trying to pay for your account, read below to learn why we have temporarily suspended payment via credit cards.

If you are not a OnceHub customer and see a charge from OnceHub on your credit card statement, your card details were stolen from another merchant and were used by fraudsters on OnceHub in order to test if the card still works so that they can use it for bigger purchases. You must notify your financial institution and cancel your card immediately.

If you are interested in the bigger story behind this incident, you can read our CEO’s summary and perspective.

Last week we posted an update on the credit card testing fraud that has impacted OnceHub. Unfortunately, this was not the end. It was only the beginning.

After a few quiet days the fraudsters came back with a massive and very sophisticated bot attack. The entire company has been working around the clock to fight this attack, refund transactions, respond to cardholders whose cards were compromised and develop additional measures to curb the attackers.

Due to the magnitude of the attack and its sophistication, it became almost impossible to differentiate between real transactions and the fraudulent transactions. We are working diligently to refund all transactions but it is possible we may have missed some.

It is our intention to fully refund all transactions. Our heart goes out to the innocent victims whose cards were stolen. We are both victims of these fraudsters.

If you do not see a refund from us within five days of the charge was made, please contact us at support@oncehub.com

The post Card Testing Fraud – Continued appeared first on OnceHub | Blog.

]]>
https://www.oncehub.com/blog/credit-card-testing-fraud-continued/feed/ 6