Blogs Archives - Streamhub.co.uk https://streamhub.co.uk/category/blogs/ Streamhub.co.uk Mon, 30 Mar 2026 09:28:43 +0000 en-GB hourly 1 https://streamhub.co.uk/wp-content/uploads/2019/07/cropped-favicon-32x32.png Blogs Archives - Streamhub.co.uk https://streamhub.co.uk/category/blogs/ 32 32 171833033 Architecting Scalable Chart Modules in Streamhub Analytics: Part II – Strategy & Factory Patterns https://streamhub.co.uk/architecting-scalable-chart-modules-in-streamhub-analytics-part-ii-strategy-factory-patterns/ Mon, 30 Mar 2026 09:07:55 +0000 https://streamhub.co.uk/?p=35398 Reading Time: 4 minutes

The post Architecting Scalable Chart Modules in Streamhub Analytics: Part II – Strategy & Factory Patterns appeared first on Streamhub.co.uk.

]]>
Reading Time: 4 minutes
In the previous post, we introduced the architectural challenges behind supporting multiple chart types within a scalable dashboard solution. We established that different visualisation libraries require data in different structural formats. This mismatch makes the transformation layer a critical part of the architecture.

In this post, we focus on how the system decides which transformation logic to apply for a given chart type. Two design patterns make this possible: Strategy and Factory. Together, they allow us to select and execute the correct transformation algorithm at runtime without introducing tight coupling or complex conditionals.

 

Strategy Pattern: Chart-Specific Data Transformations

The Strategy pattern allows us to define a family of algorithms (transformations), encapsulate each one, and make them interchangeable. In our chart module, each chart type has its own transformation strategy responsible for converting raw report data into a format suitable for the rendering library.

 

Structure

The implementation revolves around a contract interface that defines two key methods:

// Interface defining the strategy contract 
export interface IChartDataTransformer 
{  
  /**  
  * Determines if this transformer supports the given chart type.  
  * Each transformer checks if it can handle the visualization type.  
  */  
  supports(chartType: string): boolean;  
 
  /**  
  * Transforms raw report data into chart-specific format.  
  * Each transformer implements its own transformation algorithm.  
  */  
  transform(reportData: any, chartType?: string, report?: any): any; 
}

Each chart transformer implements this interface:

@Injectable({ providedIn: 'root' })
export class BarChartTransformer implements IChartDataTransformer {
  supports(chartType: string): boolean {
    // Returns true for bar chart type identifiers
  }

  transform(reportData: any): any[] {
    // Analyzes dimensions and metrics
    // Normalizes data structure
    // Applies color mapping
    // Enriches with metadata
    // Returns chart library-compatible format
  }
}

 

What Each Strategy Handles

Each transformation strategy encapsulates logic specific to a chart type. This includes:

  • Dimensional Analysis: Understanding how many dimensions and metrics are present, which affects grouping and series construction.

  • Data Normalisation: Converting the consistent API response into the structure expected by the specific visualisation library (e.g., row-based data for ag-Grid vs. series-based arrays for Highcharts).

  • Metadata Enrichment: Adding display labels, tooltip formatting, and contextual information derived from report metadata.

*Quick note: At first glance, this example may appear to violate the Single Responsibility Principle. However, in practice, the transformer acts as an orchestration layer, delegating specific responsibilities to dedicated services. The example is simplified to keep the focus on the pattern rather than internal service composition.

 

Benefits

  • Each chart type can evolve independently without impacting others.

  • Adding support for a new chart only requires implementing the interface—no changes to existing code.

  • Clear separation of concerns between transformation and rendering logic.

  • High testability: each strategy can be unit-tested in isolation using mock datasets.

 

Factory Pattern: Selecting the Right Transformer

While strategies encapsulate transformation logic, we still need a mechanism to select the correct strategy at runtime. This is where the Factory pattern comes into play.

The factory acts as a lookup mechanism that returns the appropriate transformer based on the chart type, without consumers needing to know about concrete implementations.

 

Structure

We use an injection token to collect all chart transformers, and a factory that receives them via dependency injection:

// Injection token for collecting all chart transformers
export const CHART_TRANSFORMERS = new InjectionToken<IChartDataTransformer[]>(
  'CHART_TRANSFORMERS'
);

@Injectable({ providedIn: 'root' })
export class ChartDataTransformerFactory {
  constructor(@Inject(CHART_TRANSFORMERS) private transformers: IChartDataTransformer[]) {}

  getTransformer(chartType: string): IChartDataTransformer | null {
    // Searches for transformer where supports() returns true
    // This is the common method enforced by the interface defined earlier.
    return this.transformers.find(t => t.supports(chartType)) || null;
    // Returns null if no transformer found
  }
}

The factory is used by the main chart data transformer (which participates in the pipeline we’ll see in the next post):

@Injectable({ providedIn: 'root' })
export class ChartDataTransformer implements ReportTransformer {
  constructor(private chartFactory: ChartDataTransformerFactory) {}

  isApplicable(reportData: any): boolean {
    // Checks for visualization type presence
  }

  apply(reportData: any): any[] {
    // Gets transformer from factory
    const transformer = this.chartFactory.getTransformer(..);
    if (!transformer) {
      // Throws error if no transformer found
    }
    // Delegates to transformer's transform method
    // Remember, this is part of the contract defined earlier in strategy pattern.
    return transformer.transform(..);
  }
}

 

How It Fits Together

The factory leverages Angular’s dependency injection to receive all registered transformers via the custom token. It acts as a registry and lookup: it doesn’t create transformers itself—they’re registered elsewhere (we’ll cover that in a future post). The factory is completely decoupled from specific transformer implementations.

When no transformer is found for a given chart type, the system throws a descriptive error rather than returning null. This fail-fast approach ensures bugs are caught early and production errors are clearly identifiable.

 

Benefits

  • Decouples transformer selection from usage—consumers don’t need to know which transformer to use

  • Centralised logic for transformer selection—single point of control

  • Easy to extend with new chart types—just register a new transformer

  • Type-safe transformer selection through TypeScript interfaces

  • Strategies are unaware of each other; the factory is unaware of strategy implementation details

 

Conclusion

Pairing Strategy with a simple Factory keeps the chart transformation layer flexible and disciplined. Each chart type encapsulates its transformation logic behind a common interface, while the factory selects the appropriate strategy at runtime. This approach creates a fail-fast system that detects misconfigurations early and allows new visualisations to be added without modifying existing code.


Ravindra Soman

Ravindra Soman

Senior Full Stack Data Engineer

Ravindra is a Senior Full Stack Data Engineer specialising in frontend architecture and complex data visualisation systems. In his spare time, he likes to cook new dishes for his family, read fiction and travel the world.

The post Architecting Scalable Chart Modules in Streamhub Analytics: Part II – Strategy & Factory Patterns appeared first on Streamhub.co.uk.

]]>
35398
Architecting Scalable Chart Modules in Streamhub Analytics: Part I https://streamhub.co.uk/architecting-scalable-chart-modules-in-streamhub-analytics/ Mon, 16 Feb 2026 17:17:35 +0000 https://streamhub.co.uk/?p=35241 Reading Time: 4 minutes

The post Architecting Scalable Chart Modules in Streamhub Analytics: Part I appeared first on Streamhub.co.uk.

]]>
Reading Time: 4 minutes

Problem Space & Design Goals

In modern web applications, data visualisation is a critical component that requires flexibility, maintainability, and extensibility. When building a charting system, supporting multiple chart types across heterogeneous rendering requirements quickly becomes an architectural challenge.

In our case, the system needed to support 15+ chart types that users could dynamically add to dashboards. Each chart could be powered by different charting libraries, and although the API responses were consistent, each library expected the input data in its own specific format. What initially seemed like a UI concern soon revealed itself to be a deeper issue involving data transformation, extensibility, and long-term maintainability.

This post, focuses on the challenges we faced and explains the architectural direction we chose. In the next posts we’ll see how we addressed them with a small set of design patterns.


 

Technical Context 

Our Analytics product is built using Angular as the primary frontend framework. For visualisation, we support multiple libraries depending on the widget type, including AG Grid for tabular data and Highcharts for basic chart-based visualisations, along with a few custom-rendered charts.

While the API responses remain consistent, each library imposes its own expectations on how data should be structured. This divergence in data contracts across libraries became a central factor in shaping the overall architecture.


 

 

The Core Mismatch: Same Data, Different Library

Expectations

One of the key challenges was that different visualisation components required the same dataset to be shaped differently.

For example, consider a dataset fetched from a consistent API:

[

    {"device": "android", "views": 12,000},

    { "device": "iphone", "views": 15,000 }

]

 

A data-grid widget powered by ag-Grid expects a flat row-based structure:

rowData = [

    {"device": "android", "views": 12,000},

    { "device": "iphone", "views": 15,000 }

];

However, a bar chart rendered using Highcharts expects a categorized structure:

series = [{

    name: "views",

    data: [12000, 15000]

}];

categories = ["android", "iphone"];

The underlying API data remains consistent, but each library requires a distinct transformation. As the number of supported chart types and libraries grows, this transformation layer becomes a central architectural concern rather than a simple formatting step.

 

 

Why Naive Approaches Break Down

A typical early implementation often resembles this:

switch (chartType) {

    case 'bar': return transformToHighchartsBar(data);

    case 'grid': return transformToAgGridRows(data);

    case 'line': return transformToHighchartsLine(data);

}

In practice, this switch statement and the corresponding transformation logic lived inside a single class responsible for orchestrating chart rendering. Over time, this class accumulated multiple responsibilities:

  • Deciding which chart type to render

  • Transforming raw API data

  • Handling library-specific formatting

This violated the Single Responsibility Principle and tightly coupled transformation logic with rendering decisions. Every new chart type or library variation requires modifying existing logic, violating the Open/Closed Principle and increasing the risk of regressions.


 

Core Challenges

 

1. Data Transformation Complexity

Although the API responses are consistent, each visualisation library enforces its own structural contract. Supporting multiple libraries means handling:

  • Structural reshaping (row-based vs series-based vs hierarchical)

  • Aggregation or grouping logic specific to chart types

  • Consistent normalization so that transformations remain predictable

The transformation layer must therefore be reusable and decoupled from the rendering library’s internal expectations.


 

2. Extensibility and Maintainability

As new chart types or visualisation libraries are introduced, the system should extend without requiring modifications to existing transformation logic. Without a modular design, each addition risks breaking unrelated visualisations.

Extensibility is therefore not just desirable—it is essential for long-term maintainability.


 

3. Shared State Interactions

Charts rarely operate in isolation. They react to shared dashboard inputs such as filters, metrics, and time ranges. Without clear architectural boundaries, state changes can trigger cascading re-computations that are difficult to trace and debug.

A scalable solution must ensure that state orchestration does not leak into transformation logic.


 

4. Separation of Concerns

These challenges highlighted the need for a clear separation of responsibilities across layers. Mixing decision-making, data shaping, and rendering logic within a single class created tight coupling and reduced clarity about where specific responsibilities belonged.

A more layered approach was necessary to ensure each concern could evolve independently.


 

From Naive to Scalable: Direction of Evolution

These challenges made it clear that the existing structure could not scale. The architectural evolution looked like this:                     

 

Naive Approach

In the naive approach, both decision-making and data shaping were embedded in a single class. This made the system rigid and prone to errors as new chart types were introduced.

               

 
Target Direction
 
 

The target direction separates responsibilities into distinct layers, allowing each concern to evolve independently while reducing coupling and technical debt.


 

Design Goals and Evaluation Criteria

Before settling on an architectural approach, we defined a set of guiding criteria:

  • Extensibility: Supporting a new chart type should not require changing existing transformations

  • Reusability: Common data shaping logic should be shareable across chart variants

  • Library Agnosticism: Switching or adding charting libraries should not affect core transformation logic

  • Testability: Data transformation steps should be independently unit-testable

  • Predictability: Shared dashboard state should not cause uncontrolled recomputations

These constraints ruled out monolithic conditional logic and pushed us toward a more modular, pattern-oriented architecture.


 

Architectural Direction (High-Level)

Based on these goals, we converged on three guiding ideas:

  1. A strategy-driven transformation layer to encapsulate chart-specific data shaping
  2. A factory-based resolution mechanism to select appropriate transformations dynamically
  3. An adapter layer to isolate charting library dependencies from core logic

This direction allows the system to support new chart types and libraries incrementally, without rewriting existing components.

In next post, we will see how we implemented right transformation logic for each chart type.

Ravindra Soman

Ravindra Soman

Senior Full Stack Data Engineer

Ravindra is a Senior Full Stack Data Engineer specialising in frontend architecture and complex data visualisation systems. In his spare time, he likes to cook new dishes for his family, read fiction and travel the world.

The post Architecting Scalable Chart Modules in Streamhub Analytics: Part I appeared first on Streamhub.co.uk.

]]>
35241
The Next Generation of Cross-Platform Measurement: Global Trends and Challenges https://streamhub.co.uk/the-next-generation-of-cross-platform-measurement-global-trends-and-challenges/ Tue, 03 Sep 2024 15:52:51 +0000 https://streamhub.co.uk/?p=35136 Reading Time: 3 minutes  In today’s TV, video and media environment consumers have unlimited choices and act in thousands of different ways. The audience measurement industry has struggled to keep up, unsurprisingly in fairness given that understanding and reaching audiences effectively is more complex than ever.  Now though, the experts have cracked it and cross-platform measurement has emerged […]

The post The Next Generation of Cross-Platform Measurement: Global Trends and Challenges appeared first on Streamhub.co.uk.

]]>
Reading Time: 3 minutes

 

In today’s TV, video and media environment consumers have unlimited choices and act in thousands of different ways. The audience measurement industry has struggled to keep up, unsurprisingly in fairness given that understanding and reaching audiences effectively is more complex than ever. 

Now though, the experts have cracked it and cross-platform measurement has emerged as a vital tool for the media industry, integrating data from various sources such as linear TV, BVOD, streaming and others. This comprehensive approach offers numerous benefits, making cross-platform measurement indispensable for the industry’s future for the following reasons.

 

Audience De-duplication

Audience de-duplication accounts for viewers who consume content across multiple platforms. This process ensures that media companies understand the true size and demographics of their audience. By accurately defining the audience demographic between TV and BVOD, agencies can avoid overestimating their campaign reach and deliver more precise and relevant content to distinct audience segments.

Accurate Audience Targeting

Advertisers can target their desired audiences more accurately.This also allows for quicker reach of target demographics and more efficient use of marketing budgets. Accurate audience targeting results in higher ROI for advertisers, as campaigns are tailored to engage the most relevant viewers, reducing wasted ad spend and improving campaign effectiveness.

Redefining TV and OTT Inventory

By understanding how audiences interact with content across different platforms, media companies can strategically allocate advertising inventory to maximise engagement and revenue. This redefinition ensures that both linear and served advertising are used to their fullest potential, providing advertisers with optimal exposure.

 

By achieving these, a clear understanding of audience behaviour and effective targeting leads to increased confidence in TV/AV advertising. However, a number of challenges also exist in achieving it.

Lack of Standardised Measurement Framework

One of the primary challenges is the lack of a standardised framework. Without industry-wide standards, integrating and comparing data from different platforms is complex and less reliable. Establishing a universal measurement standard is crucial for accurate cross-platform analysis.

Need for Multiple Expertise and Knowledge

Effective measurement requires a combination of skills in broadcast media, digital analytics, and data science. This need for diverse expertise can be a barrier, as it necessitates significant investment in talent and technology. Media companies must invest in training and resources to build these capabilities.

Industry-Wide Collaboration and Development

Achieving effective demands collaboration across the media industry. Broadcasters, advertisers, and technology providers must work together to develop and implement measurement standards and technologies. Industry-wide cooperation is essential for creating a unified approach that benefits all stakeholders.

 

 

Thus, there are still plenty of challenges that need to be overcome in order to achieve cross-platform measurement. The following is a selective list of pioneering work in various countries:

Australia – OzTAM

In Australia, Television Audience Measurement (OzTAM) is the cornerstone of viewership analysis. OzTAM has incorporated cross-platform measurement to offer a more accurate picture of audience behaviour, aiding broadcasters and advertisers in making data-driven decisions. This integration ensures that Australian media companies stay competitive in a rapidly changing market.

UK – Barb / CFlight

The UK leads in cross-platform measurement with initiatives driven by Barb, including CFlight. Barb provides detailed audience data across various platforms, while CFlight delivers deduplicated reach and frequency metrics for TV and BVOD ads campaigns. These tools have significantly enhanced audience targeting and campaign effectiveness in the UK.

Japan 

Japan has been relatively slow to adopt cross-platform measurement, but some broadcasters made progress last year by implementing a POC with Streamhub. It demonstrated the potential benefits of cross-platform measurement, indicating the need for broader implementation and adoption to keep pace with global standards.

 

The speed of these initiatives varies from country to country, but Streamhub will continue to engage with cross-platform measurement for the advancement of the media industry. This year, a new POC is planned in Europe, aiming to provide cross-platform solutions globally.

As data specialists, Streamhub offers transparent metrics and fair analysis. We will continue to take on various challenges to contribute to the growth of the TV and media industry. If you are daunted by the prospect of undertaking cross-platform measurement, please feel free to contact us.

 

The post The Next Generation of Cross-Platform Measurement: Global Trends and Challenges appeared first on Streamhub.co.uk.

]]>
35136
Life in the FAST lane https://streamhub.co.uk/life-in-the-fast-lane/ Fri, 10 Jun 2022 12:52:38 +0000 https://streamhub.co.uk/?p=33877 Reading Time: 3 minutes

The post Life in the FAST lane appeared first on Streamhub.co.uk.

]]>
Reading Time: 3 minutes

What’s better than watching an amazing catalogue of content for a small monthly subscription? Doing the same for free… Enter Free Ad-supported TV (FAST) channels, where you can watch compelling programming in a TV-like playlist in exchange for ads, but with easier access, choice and value to the consumer. With high adoption rates across American and European markets, it is gathering momentum as a new way to drive continuous audience engagement and high-value ad revenues.

The ROI

According to a recent Deloitte report on digital media trends, 47% of Americans now watch free ad-supported streaming TV services. Estimates cited in TV[R]EV’s research take OTT ad spend in 2025 to about US$25 billion, with FASTs being central to this growth. Big players like NBCUniversal, ViacomCBS, Amazon etc, all want a piece of the action.

The success of FASTs can be attributed to a number of factors:

  • Free
  • Large content libraries
  • User experience akin to a traditional TV
  • Device agnostic and pre-installed on many smart TV platforms

And most importantly, they carry more relevant yet lower ad-loads than TV.

 The graph above shows the number of ad impressions through FAST channels on Wurl reaching 12 times since launching in 2020. Not only that, but FAST channels performed better over time with higher viewership numbers and better ad fill rates, leading to more revenues.

Contingent upon many factors, including channel placement, ad fill rate, average CPM, content quality, duration, and refresh rates, FAST channels will drive ad revenue from $2.1 billion in 2021 to $4.1 billion in 2023. Such a return is more than enough reason for the excitement in the market to counter the decreasing revenues in linear TV.

A key differentiator, moreover, with the FAST linear viewing experience is its capability to support a wide range of audience and advertiser verticals, as shown in the following data compiled by Pluto and Tubi.

What Next?

FAST is still in its early days, with Pluto TV, the most well-known FAST channel provider having launched in 2014. What isn’t new are the typical issues that OTT providers have around measurement, user management and targeted advertising – in other words, the data ecosystem and its management.

At present, much of this data comes from disparate platforms and ad servers rather than neutral 3rd parties leading to issues of transparency and incomplete datasets, be it for audience analysis or targeting and post-campaign reporting.

Therefore an effective data strategy that links up all the different sources to unify and validate the reporting will be key. Streamhub is working with multi-service media companies including FAST channels to develop such linked measurement and reporting data platforms that can work across multiple markets.

As such, Asian markets can look to learn from early adopters in the West to build smarter collaborative models from the start, and enter the FAST lane.

To learn more on the latest in OTT/CTV and data developments, check out our blog (https://streamhub.co.uk/news/) or email bizdev@streamhub.co.uk.

Anurag Gangras

Anurag Gangras

QA and Support Analyst

Anurag is an exerienced QA tester and marketing Analyst, with a passion for all things video. By night he is also a talented video content creator. 

Read more blogs:

The post Life in the FAST lane appeared first on Streamhub.co.uk.

]]>
33877
The Quest To Unify Measurement: Adding Live + Cloud DVR viewing data https://streamhub.co.uk/unifying-measurement-adding-live-cloud-dvr-services/ Thu, 05 May 2022 12:30:04 +0000 https://streamhub.co.uk/?p=33822 Reading Time: 3 minutes

The post The Quest To Unify Measurement: Adding Live + Cloud DVR viewing data appeared first on Streamhub.co.uk.

]]>
Reading Time: 3 minutes
live streaming sports

More services = need for better measurement

Last week Streamhub launched a new suite of analytics and post-campaign reporting for Live streaming and cloud DVR services that combines it with VOD reporting to provide deduplicated and incremental reach measurement across devices. 

Live streaming reports are not new but this marks a major strategic step forward for the commercial broadcasters who can now provide fully consolidated reporting across VOD and Live streaming for both ads and programmes. 

The Challenges

Live streaming provides incremental inventory and reach to the TV channels through its dynamic ad insertion proposition. The move towards real-time dynamic ad insertion(DAI) represents a significant technical challenge, where client-side reporting is essential to provide accurate reporting compared to server-side log-based reporting. 

As streaming services and data sources proliferate the provision of a user-friendly analytics and reporting experience was of high importance, especially being a service  used by both sell-side and buy-side.

Moreover, there was a need to provide data orchestration as-a-service to clean up and automate all the different viewing logs from the different broadcasters and to standardise this data against the online digital currency panel to provide cross-service and cross-device reach and frequency metrics. 

The market implications

Prior to 2022, the legislation forbade broadcasters from providing a 24/7 live online stream of licensed linear broadcast channels in Japan. Now, however, broadcasters have finally executed their ambitions to make Live & DVR content a core part of their respective OTT offerings. 

For viewers:

Not only are they gaining access to timely Live and DVR content to enjoy, but there will also be a far more personalised advertising and content experience than could be achieved through traditional linear TV. 

For Ad sales: 

Broadcasters now have a wider pool of targetable inventory to sell, and importantly, more contextual audience data to use for activation – leading to more choice for the Advertisers and to lead to optimised yields across all inventory. 

For Editorial and Marketing: 

Furthermore, marketing and editorial teams are also benefiting greatly from the added level of contextual insights for Live and DVR consumption which can be analysed alongside VOD and linear TV audiences. This kind of apples-to-apples parity in reporting opens the door for a more nuanced understanding of the habits and behaviours of different audience segments, which if utilised well, will ultimately power a more engaged relationship between audiences and the streaming services they use every day.

How is Streamhub supporting?

Streamhub is providing the following: 

  • Data orchestration as a service
  • Panel fusion methodology across Live + VOD
  • Multi-source Analytics and reporting platform 
  • Presenting multiple viewing data types in a single platform
  • Activation platform for addressable advertising

Better measurement strategy

Maximising monetisation and audiences through connected services is a global agenda for all broadcasters to counter the halt in the growth of traditional TV advertising – especially in markets where linear TV targeting is unavailable. The Japanese market is no exception to this and the ultimate goal to protect and increase CPMs is a key mission with the introduction of the Live / cloud DVR services as the Linear TV CPMs are unusually low compared to other key markets. 

The Japanese market may be latecomers to the game, but by taking the time to consider the rollout carefully, they have been able to implement an advanced data and tech strategy where the Live streaming, DAI system and Analytics stack are shared between them to keep costs manageable but above all, as there is consensus that there is no point competing with the tech piping. 

Next steps

Through Streamhub’s shared reporting and data stack, broadcasters can now focus on developing new addressable propositions across all their connected devices and start working on incremental reach methodologies to include a diverse set of linear TV data including set-top-box data and panel data into its ad proposition.

Thanks for reading to the end – we hope this article has been insightful. For more information about Streamhub’s data services and products, head to our contact page or drop an email to bizdev@streamhub.co.uk

The post The Quest To Unify Measurement: Adding Live + Cloud DVR viewing data appeared first on Streamhub.co.uk.

]]>
33822
OTT Measurement: Egta interview with Streamub’s CEO https://streamhub.co.uk/ott-measurement-egta-interview/ Mon, 29 Nov 2021 14:56:54 +0000 https://streamhub.co.uk/?p=33582 Reading Time: 7 minutes

The post OTT Measurement: Egta interview with Streamub’s CEO appeared first on Streamhub.co.uk.

]]>
Reading Time: 7 minutes

 

Streamhub’s CEO, Aki Tsuchiya, gave an interview for Anne-Laure Dreyfus, Head of TV at egta – Association of TV & Radio Sales Houses – in which they discussed the harmonisation of OTT measurement, or, in other words, the steps and implications for setting a unified measurement for OTT with all broadcasters within a single market. They discussed the role of unifying platforms like TVer, LOVEStv, or Salto, and achievements in Japan.

Watch the interview or read it below:

Anne-Laure Dreyfus: Hi, Aki, good to have you with us today. I know that Streamhub works at the centre of VOD/AVOD helping broadcasters compile, analyse and leverage data. I know you have good experience in various markets about how the OTT ecosystem can be a little bit more collaborative and harmonised. So we’re very happy to have a bit of a chat with you today about going beyond measurement for the OTT ecosystem.

Everybody wants an advanced ecosystem in which we have across-industry OTT measurement. Do you think that our industry is ready? Are there certain markets more ready than others to have one of the unified reading markets in that direction?

Aki Tsuchiya: Hi, Anne-Laure. Thanks for having me. I think we’re in a very exciting stage, because, if you think about it, the across-industry measurement has always been at the centre of the TV business, and data has always been at the centre of it. Now with OTT, it’s just been a massive paradigm shift where first movers have brought in their own standards, and the other bigger players starting to do similar things. So in terms of the overall framework, it’s lacking. I think there lies the bigger challenge, because the OTT, let’s say “population”, is a full census that as long as you’re connected somehow, then that’s an audience. So it poses a huge challenge in terms of the data volumes, the data quantity, the calibration of the data, the reliability of whether someone is male, female, and what age groups they are.

Whilst some players have started very differently and broadcasters are catching up in that game, we’ve seen really good examples of operators trying to do something very specific. We’ve also seen JICs and research companies step up their remit to try and create a standard and make OTT measurement that much more relevant thing so that can compete against these massive digital propositions that are put forward by the FANGs and GAFAs of the world.

Anne-Laure: We see some broadcasts trying to build their own measurement system, right? I mean, trying to have a bit of a “semi” walled garden. Do you see disadvantages there? What’s the recommendation? Should they collaborate more? Should the JIC have an important role to play?

Aki: It’s very healthy that individual broadcasters can take initiative to try and push things forward because there’s a huge learning curve. Both behind the technology and, let’s say, behind the business ecosystem, about getting used to it. But at the end of the day, if individual broadcasters keep on going down that direction, it becomes very difficult to create or recreate the similar scale, the brand safety, the standardisation that the TV rating system has always offered.

I think we’re at this transition phase where people are just trying out new things, which is really healthy, but at the end of the day, I think that the JICs or research companies, in general, are in a really good position to try to transfer the existing, setup that they’ve nurtured over the years and the TV side to bring in the OTT side and go beyond even the broadcasters. I know that some initiatives are trying to invite the YouTubes and the Facebooks into that overall standardised measurements. In the case of Holland, both publishers and broadcasters are agreeing to a single video measurement, which I think is a really good start.

Anne-Laure: When you look outside of Europe, I seem to remember that you’re running an initiative in Japan, where the JIC is quite involved, right? How this collaboration is working? What data are they sharing? Can we get inspired by it?

 

Aki: I think there’s a lot we can learn from that. We were really lucky to be part of that entire ecosystem from the start. I think in Japan they’ve managed to do two things really well. One is that the JIC has stepped up to provide a very large online panel so that it becomes quite representative as a currency, almost. The second big thing that they did is that they’ve created a unified platform called TVer, which it’s all the broadcasters doing a joint-venture to compile all their ad inventory and their best catch up content. So that, from a consumer’s point of view, it’s really easy to answer, to access the content. So it really brings out the best in terms of both the premium content and the advertising proposition, and packages that go with it. So in that setup, what’s been really key is that everyone’s agreed that they don’t need to go in different directions. They invest in different technologies for the measurement side of things and more and more they’re moving towards doing a more jointly aligned activation of that same data.

If you think about what Google does, is that they offer a bunch of free services, collect as much data, and you use that data to specifically target for Google ad words or YouTube videos. So it’s as simple as that. Google is just in fact copying what the publishers and broadcasters have been doing over the years but in the digital way.

So, in Japan, the initiative that Video Research is pushing, and the broadcasters together are doing, it’s really trying to compete with that digital proposition of having a very standardized measurement, which gives all the breadth and safety. It’s a regulated, auditable dataset. It’s not a walled garden and it’s openly tradable, accessible by the different agencies, with really good access controls, so what data you show internally to the broadcasters versus what can you show to the agencies and advertisers it’s very well controlled and that same data can then be used to create specific audience targets to go through the ad servers and create much higher value CPMs.

Anne-Laure: If you don’t mind asking, how transparent is that for the other broadcasters? because I think that this might be one of the fears that broadcasters usually have. They seem to fear a joint data system. What is transparent? How much are they sharing? I think is one of the key points that are preventing some of them for collaborating in some of the European markets. So how have you solved that in the Japanese case, or in some of the other cases you might’ve seen in Europe?

 
 

Aki: Absolutely. So let’s say that the part of the measurements, which has kind of run through the JICs tags, offers a very basic set of measurements from views, the unique users and that data set is sort of, um, fused against the, uh, online panel, should we say, then offers that kind of currency. But then when the broadcasters, um, what the broadcasters can do at the same time, they can also upload their first-party registration data and create another sort of view of that same dataset that the JICs are providing. On one hand, um, this sort of online currency sort of type online panels use data is available to see across everyone. But then when the broadcast is each individually, bringing their own user registration data, only each broadcast is able to see that side of the data and then further down the line, uh, you know, for activation purposes as well, uh, that’s sort of protection of the data is very much maintained.

Anne-Laure: From your European experience, is there a barrier, a full consensus? Are there currently some things truly preventing that kind of collaboration on the OTT ecosystem in Europe?

 
 

Aki: From what we’ve seen, we’ve had really positive responses from central and Eastern European markets. Maybe in the UK, in a situation where each of the broadcasters is very competitive against each other, I think it’s more a political issue… because the technical framework and the technical execution has been proven to work either through our work in Japan or through various POCs that we’ve done already in Eastern Europe. So, I think it’s more a matter of time and consensus and everyone agreeing. We’ve seen a couple of these collaborative platforms, like Joyn in Germany, or LovesTV in Spain…

  
 

Anne-Laure: Salto, in France…

 

Aki: That’s right. So maybe through those kinds of initiatives, the political, economic, operational barriers can be easily overcome. So maybe in the case of the UK, that’s what’s missing at the moment. But I think in other markets that have these collaborations in place, it will help them in advance that discussion because at the end of the day, it’s about the cost you put in and agreeing on the operational model, because the technology is now almost ready to go.

 
 
Anne-Laure: And they’re usually very trusted also at their markets, right? I mean, they’re a trusted reference, everybody knows that they are independently audited and working on these kinds of sources probably is also reassuring for most of our members. So if everybody just sets on their strengths – and our members are providing quality relevant content or national content that also makes a lot of sense for their country – and then the JICs are playing their role, plus partners like yourselves coming with analysis and the data… It seems like we’re optimistic about this working. 2022 is looking good. 
 
 

Aki: That’s what I hope. We recently made an announcement of our partnership with Kantar media across multiple markets globally to really try and I think they have a lot of foresight and vision of how this market can evolve. So I think it’s an exciting time ahead. And maybe it can grow beyond just video to HbbTV, RPD and all kinds of data being centralised by these companies.

 
 
 
 
 
 
 

Read more blogs:

The post OTT Measurement: Egta interview with Streamub’s CEO appeared first on Streamhub.co.uk.

]]>
33582
Technical challenges behind Streamhub’s Audience Segment Builder https://streamhub.co.uk/technical-challenges-behind-streamhubs-audience-segment-builder/ Tue, 23 Nov 2021 17:15:01 +0000 https://streamhub.co.uk/?p=33100 Reading Time: 10 minutes

The post Technical challenges behind Streamhub’s Audience Segment Builder appeared first on Streamhub.co.uk.

]]>
Reading Time: 10 minutes

activate segment builder

During the summer of 2020, we decided to build Streamhub’s audience segment builder, which is a key component of our latest product module – Activate – currently available for beta users.

In the process of doing so, we faced some interesting challenges, which constitute the inspiration for this blog post.

But, wait … First, what is an audience segment builder?

Let’s assume a hypothetical customer that has programs and advertisement logs. This customer might also have CRM data, QoS or Panel data. Let’s say to simplify that the CRM data includes fields like gender, age, email, and subscription model for each of that customer’s user base.

Now, let’s consider this customer wants to target the users that are males, on premium or unlimited devices subscription, and have watched “Prison Break” for more than 20 hours in the last month.

With the audience segment builder, we can select dimensions from the datasets that the customer exposes and visually build a query with groups and nested subgroups, including program’s dimensions conditions (here, `have watched “Prison Break”`) as well as user-based conditions (here, `male users on Premium or unlimited devices subscription`) metrics conditions (here, `timeWatched > 20h`) or time-based conditions (here, `in the last month`) in the query.

From the system perspective, the output of the segment builder is a JSON payload that represents an Activate query. From the customer perspective, the output is a list of user identifiers distributed over 3 possible categories: cookies, device identifiers (AAID, IDFA), and PPID (Publisher Provided Identifiers)

This is what the audience segment builder user interface looks like nowadays.

activate segment builder

 

Figure 1: defining a segment in the audience segment builder Activate

 

A very first internal iteration of the audience segment builder UI looked like

old streamhub audience builder

Figure 2: Proof-of-Concept UI for the audience segment builder

You can see quite a few changes were made, just by looking at the 2 screenshots! But what changed and why?

Simplified and intuitive UX is the key for an audience segment builder

 

Let’s get this out of the way, the first internal version of our audience segment builder was not very user-friendly. From the 2nd screenshot, it’s obvious, just looking at the colours or the way the tool is supposed to be manipulated, with the user first having to select one of the 3 operators “All”, “Any” and “None” and then only configure the values for a particular condition.

Frontend developers among our readers might already have spotted the Angular Tree component is at use here. The whole experience was built upon the capabilities of the Angular tree component. Using a tree component was very helpful to develop the PoC quickly. However, it comes at a price: a ridiculously poor user experience.

Indeed, to express a query like

Select all the users who have watched “The Crown” and are either female or aged between 18 and 24.

With the old version, the customer would need to:

  1. Select the All operator on the root element
  2. Add and configure a condition node below it as the “have watched ‘The Crown’” condition
  3. Create a sub-group with the Any operator
  4. Add 2 conditions within the sub-group: a.  “Gender is female” / b.  “Age between 18 and 24”

While this way of thinking might be natural for a Lisp programmer, it’s not intuitive for a regular user.

So the first and main motivation to provide a newer UI and UX was to enable a more natural and linear experience similar to how most users think, starting with the condition first (“users that have watched ‘The Crown’”) and then adding an “And” operator if, and only if, a second condition is required. Other factors that led to rewriting this component included a complete change of design and theming for the UI, as well as the need to incorporate new features without being limited by the Angular Tree component or any 3rd party ready-made component.

The problem and objective were set, let’s crack on with it!

 

The design of an Audience Segment Builder

 

From a technical point of view, we knew that the new component would need to satisfy these requirements:

  • It needed to manipulate a hierarchical in-memory tree-like data structure. We will refer to it as the Query Tree for the rest of the post.
  • The query tree would be composed of groups, sub-groups, standalone conditions, and operators.
  • Within a group, the elements could be conditions, operators or sub-groups- Sub-groups could contain other sub-groups and therefore allow for any level of nesting.
  • Different types of conditions would require a different type of Angular component, meaning that the component would need to be dynamically instantiated depending on the context. To illustrate this, let’s consider:
    • a condition like “Device type is mobile, desktop, tv” can be configured with a visual component that requires 2 lists:
      • The list on the left will contain all the possible device values while the list on the right will contain the user-selected values.
    • On the other hand, a condition like “The average time watched is greater than 200 minutes” will require a different type of UI, with inputs that can accept numerical values.
    • Another case could be a condition like “users having watched ‘Breaking Bad Season 1 Ep. 3‘” which would require an autocomplete search component.
  • The system would require high consistency. To illustrate:
    • If a user linearly adds condition1 and condition2 or condition 3 within a single group, we don’t know if the brackets should be placed around (condition1 and condition2) or placed around (condition 2 or condition3).
    • In this case, we ask the user to disambiguate the situation by letting him choose whether he wants all the operators to be ands or ors.
    • Alternatively, the user can also choose to create a nested sub-group within the current sub-group to hold either one of the 2 arrangements of brackets. Sub-groups are a metaphor for brackets.
  • The query tree would need to be marshalled to be persisted or processed by the backend stack. Upon reloading a segment, the query tree would need to be reconstructed (we’ll come back to this in detail)

Key Angular components

What was a nice realisation was that most of the above technical points could be implemented with simple Angular primitives:

  • The NgForOf directive would let us iterate through the elements of a group or subgroup and render them.
  • Angular @Component would let us define a few wrapper components for the elements manipulated by the SB. We defined:
    • GroupComponent, to represent a top-level group
    • RuleSubGroupComponent, which is a metaphor for brackets. It can contain conditions and other RuleSubGroupComponents thus allowing for any level of nested subqueries within a query
    • RuleOperatorComponent, which represents an operator between 2 top-level groups (possible values are and, or, except) or between 2 subgroups (possible values are and, or)
    • ConditionPlaceholderComponent, a placeholder component to add a new condition to the query tree.
    • SegmentBuilderWidgetComponent: used as an envelope to dynamically instantiate any other kind of component, like the TwoListsComponent mentioned in the requirements.
  • @ViewChildren, @Input(), @Output() decorators would let us define clear channels of communication within the component tree
    • Between child and parent (example, condition → enclosing subgroup)
    • Between parent and children (example, subgroup → conditions, subgroup → operators)
    • Between siblings (example, between 2 conditions enclosed within 2 distinct subgroups)
  • Angular’s ComponentFactoryResolver would allow us to dynamically instantiate components depending on the context.

Have a look at a (simplified) version of the HTML involved to render the Segment Builder.

In segment.builder.component.html the root *ngFor loop renders the first level of the Query Tree (the top-level groups):

 
<!-- The segment builder rendering logic -->
<div *ngFor="let element of queryTree"><!-- rendering each node of the query tree --> 
 <group-operator #groupOperator [element]="element" ...></group-operator>
 <group #group (onRemoveGroup)="on...($event)" [element]="element" ...></group>
</div>
<!-- *ngFor -->

Now, let’s deep dive into a Group component’s HTML. The inner *ngFor loop will render the elements within the group.

 
<div *ngIf="isGroup(element)">
 <div ...>{{"GROUP" | translate}}</div>
 <div ...>

   <!-- control-flow components here. skipping that part --> 

   <!-- Group’s inner *ngFor loop will render the elements within a group --> 
   <div *ngFor="let child of element.value" class="...">

     <!-- the element can be a Generic segment-builder-widget-component (an envelope to construct any other components at runtime) -->
     <segment-builder-widget-component #widgets
                                       [element]="child"
                                       [groupData]="element" ...>             
</segment-builder-widget-component>

     <!-- element can also be a rule operator ... ->
     <rule-operator #ruleOperator
                    [siblings]="element.value"
                    [element]="child" ...></rule-operator>


     <!-- … or a placeholder for a new condition ->
     <condition-placeholder
       [element]="child" ...></condition-placeholder>

     <!-- … or a Sub-Group -->
     <rule-sub-group #ruleSubGroup
       [groupData]="element"
       [element]="child" ...>
     </rule-sub-group>

   </div>
   <!-- *ngFor -->
   <!-- a few more controls come here. Skipping that part -->
   <!-- Recency & Frequency component. Skipping that part →
 </div>
</div>

Finally, the most nested *ngFor loop within the rule-sub-group.component.html will render the leaves of the Audience Segment Builder. Note that the structure is recursive here with the rule-sub-group component being a possible element within the inner loop of rule-sub-group.component.html 

 
<div ...>
 <div ...>{{"SUB_GROUP" | translate}}</div>
 <div ...>


   <!-- skipping controls here -->

   <div *ngFor="let child of element.value">

     <!-- nested sub-group -->
     <rule-sub-group #ruleSubGroup
                     ...
                     [element]="child"
                     [groupData]="groupData" ...>
     </rule-sub-group>

     <!-- skipping other nested components ... -->
   </div> </div> </div>

To summarise, given a hierarchical tree data structure (the Query Tree), a couple of user-defined components (group, subgroup, condition, operator, widget), the ngForOf directive, and a few sass-based classes (to materialize the layer of nesting mainly) we can render any segment in the Segment Builder.

Of course, there are other aspects which we are not covering here, for example regarding the flow of events within the SB: adding and removing conditions/operators/sub-groups, managing the internal states of the SB (locking/unlocking the SB when the user operates on the current node), but from the strict point of view of rendering the Query Tree, this is pretty much what was required. 

On top of what Angular already provided, we added 2 services:

  • A TreeAlgorithmService, which implemented generic versions of Depth-First search and Breadth-first search algorithms as higher-order functions. 
    • Being higher-order functions, these functions can accept another function as a parameter to represent the matching criteria to select a node. This is useful to select any kind of node in the query tree based on simple predicates.
  • A MarshallingService, which implemented the logic to transform the query tree into a JSON equivalent payload that could be sent to the API.

Challenges of marshalling and unmarshalling the query tree

As we saw, the in-memory structure that the segment builder is manipulating is called a Query Tree. This is a simple data structure that is made of JavaScript Arrays and Objects. The default query tree when starting a new empty segment resembles this 

[
 {
   id: uuid(),
   nodeType: "GROUP",
   root: true,
   name: "",
   datasetId: -1,
   recencyAndFrequency: {},
   value: [
     {
       id: uuid(),
       nodeType: "RULE_SUB_GROUP",
       root: true,
       name: "",
       value: [
         {
           id: uuid(),
           nodeType: "CONDITION_PLACEHOLDER",
           root: true,
           value: "SELECT_DIMENSION_PLACEHOLDER"
         }
       ]
     }
   ]
 }
]

Figure 3: the query tree manipulated by the audience segment builder in Activate

As we see, any object in it can have a value property that itself contains an array of objects, and therefore can be iterated.

These arrays of objects are literally what the Angular ngForOf directives are iterating over when rendering the DOM. The query tree is very close to the HTML that is rendered in the UI. By contrast, the way the segment is persisted into the DB storage or processed by the backend API is quite different from the query tree. To illustrate, this is how a small portion of a segment looks like once stored in MongoDB: 

{
    "groupOperator": "UNION",
    "groupChildren": [
      {
        "groupRule": {
          "name": "G0",
          "query": {
            "datasetId": {
              "$numberInt": "0"
            },
            "dimensions": [],
            "filters": {
              "children": [
                {
                  "rule": {
                    "dimension": "programs:id",
                    "value": [
                      {
                        "$numberLong": "xxx"
                      }
                    ],
                    "operator": "Any"
                  }

Figure 4: an Activate segment, once stored into MongoDB

Depending on the context, converting one representation into another could get complicated. This is because some parts of a segment will be treated differently by the UI and by the API.

For instance, if a date range is applied to a segment, the API expects the segment payload to contain an additional ‘date’ dimension for each sub-groups defined by the segment, connected by an AND operator with the rest of the conditions in the sub-group. Let’s assume a user has created a segment with 2 subgroups: (condition A or condition B) and (condition C or condition D)

Now, if the user wants to apply a date range restriction to the segment, the generated payload should be set as:daterange and ((condition A or condition B) and  (condition C or condition D))

So there are transformations involved. These transformations are relatively easy to implement in one direction (from Query Tree to API payload) but would be more difficult to implement in the other direction (reconstructing the original user-defined Query Tree from the API payload)

Besides, we wanted to have full flexibility on the UI side of things and provide a flow that is as convenient as possible for the end-user.

To reduce the code complexity and guarantee that once loaded back the segment is faithful to what the user had created, we chose to convert between the UI representation and the API representation in only 1 direction, that is in the marshalling direction.

In practice, what it means is that we store the Query Tree itself (or rather an altered version), as a property of the Segment payload. 

The steps involved;

  1. First, we transform the Query Tree into a binary-equivalent representation. 
  2. Then, we use a lossless compression algorithm to reduce the size of the binary-equivalent representation
  3. Finally, we take the base64 of the compressed binary representation and store it as a property of the Segment payload, namely the uiData property.

By doing that, we save on the marshalling complexity when reloading an existing segment into the Segment Builder because we only need to decode and uncompress the query tree from the API responses into memory, as opposed to having to reconstruct the Query Tree from the API response itself.

Collaterally, we also avoid potentially hard to detect bugs. Given that segments can be created, then loaded back and updated multiple times, any glitch in the marshalling logic would only increase the damage done over time. 

Another advantage of using the Query Tree as an intermediate UI representation of a segment is that it allows performing some optimizations while marshalling it. 

For instance, it becomes possible to simplify the payload to get rid of unnecessary levels of nesting, which in turn, makes processing the payload faster as it takes fewer operations on the backend to handle it.

Below are some of the optimizations we perform when converting the Query tree into the API payload equivalent:

  • If a sub-group X contains a nested sub-group Y which itself contains a single condition C, then the structure can be simplified so that C becomes a direct child node of X.
  • Any group that contains a single direct sub-group can also be flattened so that the sub-groups children are exposed directly
  • Empty sub-groups can be eliminated.
  • Any subgroup that connects its children with the same operator that connects the sub-group with a standalone condition can also be flattened. To illustrate, this is the case where the user has defined: (condition C and (condition D and condition E)) which can be simplified by getting rid of the subgroup surrounding (D and E) =>  (condition C and condition D and condition E)

While we perform these optimizations during the marshalling phase, we do not modify the user-defined query tree. We only reduce the complexity and size of the generated API payload.

When loading back the same segment later in the SB, the segment is presented exactly as it was created originally by the user.

Voila! I hope you have enjoyed this reading. Please let me know if you have any questions!

 
Tony Broyez

Tony Broyez

Senior Full Stack Data Integration Engineer at Streamhub

Tony is an experienced and versatile programmer with more than 15 years of experience mainly in the media/tech industry. His skills have ramifications into data collection and preparation, data computation and export, as well as data visualisations. When he’s not coding, he can be found having fun with his 2 young kids Theo and Tom.

Would you like to work with the guy behind this article? Why don’t you join our engineering team?

Senior Data Operations Engineer (Contract / Part Time / Remote)

Applications Engineer (Microservices|Java|K8s) – PERM / Bengaluru

 

 

Read more blogs:

The post Technical challenges behind Streamhub’s Audience Segment Builder appeared first on Streamhub.co.uk.

]]>
33100
Testing Library Blog Post https://streamhub.co.uk/testing-library-blog-post/ Thu, 18 Nov 2021 14:49:00 +0000 https://streamhub.co.uk/?p=33560 Reading Time: 2 minutes

The post Testing Library Blog Post appeared first on Streamhub.co.uk.

]]>
Reading Time: 2 minutes

 

From Bangalore to London, Streamhub is speeding up and growing fast, as 2021 sees the team almost double in size and there are still vacancies to be filled in Engineering and Marketing teams.

Have a look if you have the profile and share the opportunity if your network if you know someone who can be among the next talent we hire.

Senior Data Operations Engineer (Contract / Part Time / Remote)

Some of the skills required for this position are:

  • Solid experience in supporting complex data pipelines with technologies like Airflow, AWS, and Kubernetes.
  • Solid experience in operationally maintaining Kubernetes cluster.
  • Experience in working with scripting languages – Python/Ruby
  • Experience in cloud computing, preferably AWS.

Another vacancy open in the Engineering team is:

Applications Engineer (Microservices|Java|K8s) – PERM

This is a position for an Engineer to join our team in Bengaluru, India, or to work remotely.

To apply for this job position you must have:

  • Solid experience in Scala or Java.
  • Exposure to building user interfaces preferably using Angular or ReactJS.
  • Solid experience with Docker, container services like Kubernetes, infrastructure tools like Terraform/Ansible. Including operational handling.

On another note, we are also looking for an industry-savvy, experienced Marketing Analyst to join our efforts on B2B initiatives and to proactively participate in the building of 2022’s strategy and action plans.

Marketing Analyst (London, UK / Full Time) 

This role suits better a generalist with a background in either Ad Tech companies or Broadcasters and those are some of the skills and experience we are looking for on the candidates for this role:

  • Event Organization (On-line/Off-line)
  • Creating and Editing Sales Collateral
  • Google Tag Manager, Mailchimp, Hubspot, Pipedrive, Slack, Trello
  • Content Creation)
  • Media and Partners Relations
  • Market Research
  • B2B Data or Ad Tech Company or OTT/Streaming/Broadcast/Publisher/AdTech Industry
  • Native-level English and UK Work permit

Have a look also on our values to check if you are the perfect match and prepare ahead for the job interview!

Be a part of this exciting startup/scaleup that is accelerating fast, with offices in London, Tokyo and Bangalore and is a restless data-driven and highly creative team and apply today.

 

Read more blogs:

The post Testing Library Blog Post appeared first on Streamhub.co.uk.

]]>
33560
New Template for Blog Post – Don’t Duplicate https://streamhub.co.uk/new-template-for-blog-post-dont-duplicate/ Mon, 01 Nov 2021 21:26:55 +0000 https://streamhub.co.uk/?p=32721 Reading Time: 6 minutes

The post New Template for Blog Post – Don’t Duplicate appeared first on Streamhub.co.uk.

]]>
Reading Time: 6 minutes

New Template for Blog Post – Don’t Duplicate

 

From Bangalore to London, Streamhub is speeding up and growing fast, as 2021 sees the team almost double in size and there are still vacancies to be filled in Engineering and Marketing teams.

Have a look if you have the profile and share the opportunity if your network if you know someone who can be among the next talent we hire.

Senior Data Operations Engineer (Contract / Part Time / Remote)

Some of the skills required for this position are:

  • Solid experience in supporting complex data pipelines with technologies like Airflow, AWS, and Kubernetes.
  • Solid experience in operationally maintaining Kubernetes cluster.
  • Experience in working with scripting languages – Python/Ruby
  • Experience in cloud computing, preferably AWS.

Another vacancy open in the Engineering team is:

Applications Engineer (Microservices|Java|K8s) – PERM

This is a position for an Engineer to join our team in Bengaluru, India, or to work remotely.

To apply for this job position you must have:

  • Solid experience in Scala or Java.
  • Exposure to building user interfaces preferably using Angular or ReactJS.
  • Solid experience with Docker, container services like Kubernetes, infrastructure tools like Terraform/Ansible. Including operational handling.

On another note, we are also looking for an industry-savvy, experienced Marketing Analyst to join our efforts on B2B initiatives and to proactively participate in the building of 2022’s strategy and action plans.

Marketing Analyst (London, UK / Full Time) 

This role suits better a generalist with a background in either Ad Tech companies or Broadcasters and those are some of the skills and experience we are looking for on the candidates for this role:

  • Event Organization (On-line/Off-line)
  • Creating and Editing Sales Collateral
  • Google Tag Manager, Mailchimp, Hubspot, Pipedrive, Slack, Trello
  • Content Creation)
  • Media and Partners Relations
  • Market Research
  • B2B Data or Ad Tech Company or OTT/Streaming/Broadcast/Publisher/AdTech Industry
  • Native-level English and UK Work permit

Have a look also on our values to check if you are the perfect match and prepare ahead for the job interview!

Be a part of this exciting startup/scaleup that is accelerating fast, with offices in London, Tokyo and Bangalore and is a restless data-driven and highly creative team and apply today.

 

Related Articles

Feature showcase: Report compare mode

Feature showcase: Report compare mode

    Our solution - Streamhub Analytics   Streamhub Analytics is a unified reporting platform for content and advertising with multi-data source analysis, including OTT data, viewing logs, online panel and user data. The platform consists of three...

Stay Up to Date With The Latest News & Updates

The post New Template for Blog Post – Don’t Duplicate appeared first on Streamhub.co.uk.

]]>
32721
Streamhub grows team and hires for Engineering and Marketing https://streamhub.co.uk/streamhub-grows-team-and-hires-for-engineering-and-marketing/ Tue, 26 Oct 2021 13:49:35 +0000 https://streamhub.co.uk/?p=32710 Reading Time: 2 minutes

The post Streamhub grows team and hires for Engineering and Marketing appeared first on Streamhub.co.uk.

]]>
Reading Time: 2 minutes

From Bangalore to London, Streamhub is speeding up and growing fast, as 2021 sees the team almost double in size and there are still vacancies to be filled in Engineering and Marketing teams.

Have a look if you have the profile and share the opportunity if your network if you know someone who can be among the next talent we hire.

Senior Data Operations Engineer (Contract / Part Time / Remote)

Some of the skills required for this position are:

  • Solid experience in supporting complex data pipelines with technologies like Airflow, AWS, and Kubernetes.
  • Solid experience in operationally maintaining Kubernetes cluster.
  • Experience in working with scripting languages – Python/Ruby
  • Experience in cloud computing, preferably AWS.

Another vacancy open in the Engineering team is:

Applications Engineer (Microservices|Java|K8s) – PERM

This is a position for an Engineer to join our team in Bengaluru, India, or to work remotely.

To apply for this job position you must have:

  • Solid experience in Scala or Java.
  • Exposure to building user interfaces preferably using Angular or ReactJS.
  • Solid experience with Docker, container services like Kubernetes, infrastructure tools like Terraform/Ansible. Including operational handling.

On another note, we are also looking for an industry-savvy, experienced Marketing Analyst to join our efforts on B2B initiatives and to proactively participate in the building of 2022’s strategy and action plans.

Marketing Analyst (London, UK / Full Time) 

This role suits better a generalist with a background in either Ad Tech companies or Broadcasters and those are some of the skills and experience we are looking for on the candidates for this role:

  • Event Organization (On-line/Off-line)
  • Creating and Editing Sales Collateral
  • Google Tag Manager, Mailchimp, Hubspot, Pipedrive, Slack, Trello
  • Content Creation)
  • Media and Partners Relations
  • Market Research
  • B2B Data or Ad Tech Company or OTT/Streaming/Broadcast/Publisher/AdTech Industry
  • Native-level English and UK Work permit

Have a look also on our values to check if you are the perfect match and prepare ahead for the job interview!

Be a part of this exciting startup/scaleup that is accelerating fast, with offices in London, Tokyo and Bangalore and is a restless data-driven and highly creative team and apply today.

 

Read more blogs:

The post Streamhub grows team and hires for Engineering and Marketing appeared first on Streamhub.co.uk.

]]>
32710