Tech spotlight: How to implement async requests in your Python code
Tech spotlight: How to implement async requests in your Python code
copy gray iconlinkedin graytwitter grey

Tech spotlight: How to implement async requests in your Python code

January 6, 2022

Overview

Traditionally, Python has been a blocking language when it comes to I/O and networking, meaning lines of code are executed one at a time. With network requests, we have to wait for the response before we can make another request. Meanwhile, our computers sit idling. Luckily, there are ways to address this, the most exciting of which is leveraging asynchronous requests with the aiohttp package. This article explains how asynchronicity can help solve these issues – and how you can put it into place within your own code!

Background: Python and Asynchronicity

Although Python is no stranger to asynchronicity with its multiprocessing package dating back to 2008, it didn't quite achieve the same status as the async/await paradigm in Javascript. With the release of Python 3.7, the async/await syntax has put our computers back to work and allowed for code to be performed concurrently.  We can now fire off all our requests at once and grab the responses as they come in.

Multiprocessing enables a different level of asynchronicity than the async/await paradigm. Python’s multiprocessing package enables multi-core processing. This means the same code can run concurrently on separate processes without blocking one another. This allows for true parallelism of CPU-bound tasks. It can be overkill if you require concurrency on tasks that are simply I/O bound which the async/await paradigm is better suited for.

Asynchronous Pinwheels

At Pinwheel, we have an API for retrieving payroll data such as Paystubs, Income, Identity, Shifts, Employment, and Direct Deposit Allocations data. It takes no stretch of the imagination that getting this info can involve a lot of requests.

Pinwheel uses async/await to concurrently retrieve payroll data. Implementing a project with asynchronous requests can yield enormous benefits by reducing latency. Using asynchronous requests has reduced the time it takes to retrieve a user's payroll info by up to 4x. To see async requests in action we can write some code to make a few requests. Read on to learn how to leverage asynchronous requests to speed-up python code.

Trying out async/await

Let's write some code that makes parallel requests. To test this we can use the Coinbase API to get the current prices of various cryptocurrencies.

Coroutine Maintenance

The aiohttp package is emerging as the standard for handling asynchronous HTTP requests. To get started we can install the aiohttp package.

$ pip install aiohttp

view rawinstall.sh hosted with ❤ by GitHub

We can leverage aiohttp and the builtin aysncio package to make requests. Our first function that makes a simple GET request will create in async land what is called a coroutine. Coroutines are created when we combine the async and await syntax.

async def get_url(session: aiohttp.ClientSession, url: str) -> Dict:    async with session.get(url) as response:        return await response.json()

view rawget_url.py hosted with ❤ by GitHub

In the above example (modeled off of the aiohttp request lifecycle example from the docs) we take in aiohttp's ClientSession and a URL as arguments and call .get() on the ClientSession. One of the big differences between aiohttp and the old school requests package is that the response attributes live inside a context manager (under the hood the dunder methods __aenter__ and __aexit__ are being called). That means if we want to do something with status codes or response history we need to do so within this block.

...async with session.get(url) as response:    if response.status == 503: # do some work

view rawstatus_code.py hosted with ❤ by GitHub

If we are making a request to an endpoint that returns JSON content we would naturally like to turn the response into a python dictionary. In the function above we use .json() to do just that. We could also await .text() to turn HTML into a string or even .read() to handle byte content (ie. pdfs maybe?).

What about POST? Swap out .get() for .post() and then pass whatever payload you need in the data kwarg.

async with session.post(url, data=payload) as response:    ...

view rawpost.py hosted with ❤ by GitHub

A List of Tasks

The next step is to set up session persistence that we can maintain in all our requests. Luckily aiohttp's ClientSession allows us to do this. The following code block creates the Client Session to pass into the get_url function.

async def request_urls(urls: List[str]):    async with aiohttp.ClientSession() as session:        tasks: List[asyncio.Task] = []        for url in urls:            tasks.append(                asyncio.ensure_future(                    get_url(session, url)                )            )        return await asyncio.gather(*tasks)

view rawtasks.py hosted with ❤ by GitHub

We are again using a context manager but this time to handle the session. The great thing about reusing the ClientSession like this is that any headers or cookies passed to the session will be used for all of our requests. When we instantiate the ClientSession this is where we can pass headers, cookies, or a TraceConfig object (for logging!) as kwargs.

async with aiohttp.ClientSession(    headers=headers_dict,    cookies=cookies_dict,    trace_configs=[trace_config],) as session:    ...

view rawheaders_cookies.py hosted with ❤ by GitHub

Back to the Future

Next we are creating a list of tasks to execute. Asyncio's method ensure_future allows for coroutines to be turned into Tasks so they are not immediately called. In our case we want the coroutine get_url that we wrote above to be converted into a Task.

task: asyncio.Task = asyncio.ensure_future(    get_url(session, url))

view rawfuture.py hosted with ❤ by GitHub

The tasks are then passed to asyncio's gather which schedules each coroutine.

async def request_urls(urls: List[str]):    tasks: List[asyncio.Task] = []    ...        return await asyncio.gather(*tasks)

view rawgather.py hosted with ❤ by GitHub

The final step is to pass the request_urls function to Asyncio's run method. Remember that request_urls is in fact just a coroutine defined by the async/await syntax. This asyncio method will execute our coroutine and concurrently execute the scheduled tasks.

responses: List[Dict] = asyncio.run(request_urls(urls))

view rawresponses.py hosted with ❤ by GitHub

All Together Now

Let's see it all together! Here is some code that makes concurrent requests to the Coinbase API to get crypto to USD exchange rates.

import asyncioimport aiohttpCRYPTOS: List[str] = [    "BTC",    "ETH",    "DOGE",    "BCH",    "ETC",    "LTC",]URLS: List[str] = [    f"https://api.coinbase.com/v2/prices/{crypto}-USD/buy"    for crypto in CRYPTOS]async def request_urls(urls: List[str]):    async with aiohttp.ClientSession() as session:        tasks: List[asyncio.Task] = []        for url in urls:            tasks.append(                asyncio.ensure_future(                    get_url(session, url)                )            )        return await asyncio.gather(*tasks)async def get_url(session: aiohttp.ClientSession, url: str) -> Dict:    async with session.get(url) as response:        return await response.json()responses: List[Dict] = asyncio.run(request_urls(URLS))print(responses)

view rawasync_crypto.py hosted with ❤ by GitHub

Running the code, we get the list of dicts printed to the console. The best part is that the responses are in the same order as our urls. Even if the last endpoint comes in first aiohttp doesn't reorder our list.

$ python3 async_crypto.py[{'data': {'base': 'BTC', 'currency': 'USD', 'amount': '58995.78'}}, {'data': {'base': 'ETH', 'currency': 'USD', 'amount': '4467.16'}}, {'data': {'base': 'DOGE', 'currency': 'USD', 'amount': '0.22'}}, {'data': {'base': 'BCH', 'currency': 'USD', 'amount': '582.49'}}, {'data': {'base': 'ETC', 'currency': 'USD', 'amount': '48.59'}}, {'data': {'base': 'LTC', 'currency': 'USD', 'amount': '208.84'}}]

view rawgistfile1.sh hosted with ❤ by GitHub

So what kind of benefits can we see? To see the difference in latency let's do an A/B test, comparing sync requests using pythons requests package vs async requests with aiohttp. To do this we can use the time package to measure the difference in seconds for the requests approach below and the async request_urls function.

from time import timeresponses: List[Dict] = []start_time: float = time()for url in URLS:    responses.append(requests.get(url).json())end_time: float = time()print(end_time - start_time)

view rawtime_test.py hosted with ❤ by GitHub

Looking at the average time it takes to request endpoints sync vs. async, even with the small list of six URLs, we can see a clear winner. One can only imagine the benefits when a list of URLs is much larger!

And that's it! Asynchronous requests using aiohttp is a great tool for speeding up your code. There are many other options for executing code concurrently and plenty of use cases for making requests one at a time. But concurrent code is becoming a bigger part of Python and understanding asynchronicity is a powerful asset.

linkedin gray logotwitter gray logo
Insights

Tech spotlight: How to implement async requests in your Python code

Insights

Tech spotlight: How to implement async requests in your Python code

Challenge

checkmark icon
Solution

Ready to discover what Pinwheel can do for you?

Get Started ➔

Overview

Traditionally, Python has been a blocking language when it comes to I/O and networking, meaning lines of code are executed one at a time. With network requests, we have to wait for the response before we can make another request. Meanwhile, our computers sit idling. Luckily, there are ways to address this, the most exciting of which is leveraging asynchronous requests with the aiohttp package. This article explains how asynchronicity can help solve these issues – and how you can put it into place within your own code!

Background: Python and Asynchronicity

Although Python is no stranger to asynchronicity with its multiprocessing package dating back to 2008, it didn't quite achieve the same status as the async/await paradigm in Javascript. With the release of Python 3.7, the async/await syntax has put our computers back to work and allowed for code to be performed concurrently.  We can now fire off all our requests at once and grab the responses as they come in.

Multiprocessing enables a different level of asynchronicity than the async/await paradigm. Python’s multiprocessing package enables multi-core processing. This means the same code can run concurrently on separate processes without blocking one another. This allows for true parallelism of CPU-bound tasks. It can be overkill if you require concurrency on tasks that are simply I/O bound which the async/await paradigm is better suited for.

Asynchronous Pinwheels

At Pinwheel, we have an API for retrieving payroll data such as Paystubs, Income, Identity, Shifts, Employment, and Direct Deposit Allocations data. It takes no stretch of the imagination that getting this info can involve a lot of requests.

Pinwheel uses async/await to concurrently retrieve payroll data. Implementing a project with asynchronous requests can yield enormous benefits by reducing latency. Using asynchronous requests has reduced the time it takes to retrieve a user's payroll info by up to 4x. To see async requests in action we can write some code to make a few requests. Read on to learn how to leverage asynchronous requests to speed-up python code.

Trying out async/await

Let's write some code that makes parallel requests. To test this we can use the Coinbase API to get the current prices of various cryptocurrencies.

Coroutine Maintenance

The aiohttp package is emerging as the standard for handling asynchronous HTTP requests. To get started we can install the aiohttp package.

$ pip install aiohttp

view rawinstall.sh hosted with ❤ by GitHub

We can leverage aiohttp and the builtin aysncio package to make requests. Our first function that makes a simple GET request will create in async land what is called a coroutine. Coroutines are created when we combine the async and await syntax.

async def get_url(session: aiohttp.ClientSession, url: str) -> Dict:    async with session.get(url) as response:        return await response.json()

view rawget_url.py hosted with ❤ by GitHub

In the above example (modeled off of the aiohttp request lifecycle example from the docs) we take in aiohttp's ClientSession and a URL as arguments and call .get() on the ClientSession. One of the big differences between aiohttp and the old school requests package is that the response attributes live inside a context manager (under the hood the dunder methods __aenter__ and __aexit__ are being called). That means if we want to do something with status codes or response history we need to do so within this block.

...async with session.get(url) as response:    if response.status == 503: # do some work

view rawstatus_code.py hosted with ❤ by GitHub

If we are making a request to an endpoint that returns JSON content we would naturally like to turn the response into a python dictionary. In the function above we use .json() to do just that. We could also await .text() to turn HTML into a string or even .read() to handle byte content (ie. pdfs maybe?).

What about POST? Swap out .get() for .post() and then pass whatever payload you need in the data kwarg.

async with session.post(url, data=payload) as response:    ...

view rawpost.py hosted with ❤ by GitHub

A List of Tasks

The next step is to set up session persistence that we can maintain in all our requests. Luckily aiohttp's ClientSession allows us to do this. The following code block creates the Client Session to pass into the get_url function.

async def request_urls(urls: List[str]):    async with aiohttp.ClientSession() as session:        tasks: List[asyncio.Task] = []        for url in urls:            tasks.append(                asyncio.ensure_future(                    get_url(session, url)                )            )        return await asyncio.gather(*tasks)

view rawtasks.py hosted with ❤ by GitHub

We are again using a context manager but this time to handle the session. The great thing about reusing the ClientSession like this is that any headers or cookies passed to the session will be used for all of our requests. When we instantiate the ClientSession this is where we can pass headers, cookies, or a TraceConfig object (for logging!) as kwargs.

async with aiohttp.ClientSession(    headers=headers_dict,    cookies=cookies_dict,    trace_configs=[trace_config],) as session:    ...

view rawheaders_cookies.py hosted with ❤ by GitHub

Back to the Future

Next we are creating a list of tasks to execute. Asyncio's method ensure_future allows for coroutines to be turned into Tasks so they are not immediately called. In our case we want the coroutine get_url that we wrote above to be converted into a Task.

task: asyncio.Task = asyncio.ensure_future(    get_url(session, url))

view rawfuture.py hosted with ❤ by GitHub

The tasks are then passed to asyncio's gather which schedules each coroutine.

async def request_urls(urls: List[str]):    tasks: List[asyncio.Task] = []    ...        return await asyncio.gather(*tasks)

view rawgather.py hosted with ❤ by GitHub

The final step is to pass the request_urls function to Asyncio's run method. Remember that request_urls is in fact just a coroutine defined by the async/await syntax. This asyncio method will execute our coroutine and concurrently execute the scheduled tasks.

responses: List[Dict] = asyncio.run(request_urls(urls))

view rawresponses.py hosted with ❤ by GitHub

All Together Now

Let's see it all together! Here is some code that makes concurrent requests to the Coinbase API to get crypto to USD exchange rates.

import asyncioimport aiohttpCRYPTOS: List[str] = [    "BTC",    "ETH",    "DOGE",    "BCH",    "ETC",    "LTC",]URLS: List[str] = [    f"https://api.coinbase.com/v2/prices/{crypto}-USD/buy"    for crypto in CRYPTOS]async def request_urls(urls: List[str]):    async with aiohttp.ClientSession() as session:        tasks: List[asyncio.Task] = []        for url in urls:            tasks.append(                asyncio.ensure_future(                    get_url(session, url)                )            )        return await asyncio.gather(*tasks)async def get_url(session: aiohttp.ClientSession, url: str) -> Dict:    async with session.get(url) as response:        return await response.json()responses: List[Dict] = asyncio.run(request_urls(URLS))print(responses)

view rawasync_crypto.py hosted with ❤ by GitHub

Running the code, we get the list of dicts printed to the console. The best part is that the responses are in the same order as our urls. Even if the last endpoint comes in first aiohttp doesn't reorder our list.

$ python3 async_crypto.py[{'data': {'base': 'BTC', 'currency': 'USD', 'amount': '58995.78'}}, {'data': {'base': 'ETH', 'currency': 'USD', 'amount': '4467.16'}}, {'data': {'base': 'DOGE', 'currency': 'USD', 'amount': '0.22'}}, {'data': {'base': 'BCH', 'currency': 'USD', 'amount': '582.49'}}, {'data': {'base': 'ETC', 'currency': 'USD', 'amount': '48.59'}}, {'data': {'base': 'LTC', 'currency': 'USD', 'amount': '208.84'}}]

view rawgistfile1.sh hosted with ❤ by GitHub

So what kind of benefits can we see? To see the difference in latency let's do an A/B test, comparing sync requests using pythons requests package vs async requests with aiohttp. To do this we can use the time package to measure the difference in seconds for the requests approach below and the async request_urls function.

from time import timeresponses: List[Dict] = []start_time: float = time()for url in URLS:    responses.append(requests.get(url).json())end_time: float = time()print(end_time - start_time)

view rawtime_test.py hosted with ❤ by GitHub

Looking at the average time it takes to request endpoints sync vs. async, even with the small list of six URLs, we can see a clear winner. One can only imagine the benefits when a list of URLs is much larger!

And that's it! Asynchronous requests using aiohttp is a great tool for speeding up your code. There are many other options for executing code concurrently and plenty of use cases for making requests one at a time. But concurrent code is becoming a bigger part of Python and understanding asynchronicity is a powerful asset.

Always stay up to date

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
View our Privacy Policy   ➔

Up next

Pinwheel Pulse: 2024 Year in Review

Pinwheel Pulse: 2024 Year in Review

From groundbreaking product developments to new partnerships, 2024 has been a banner year for Pinwheel, our partners, and our customers.

Read more  ➔
Why credit unions have a neighborhood advantage

Why credit unions have a neighborhood advantage

n an era dominated by digital innovation, physical branches remain relevant—and even essential. While many national financial institutions are doubling down on digital channels and closing branches, 60% of new accounts are still being opened in person. This underscores a critical competitive differentiator for credit unions, who maintain a unique home town advantage.

Read more  ➔
The Product Pulse

The Product Pulse

Pinwheel Pulse is where we share recent highlights on our journey to building solutions that drive primacy and unlock the potential of payroll connectivity.

Read more  ➔
Introducing Bill Navigator

Introducing Bill Navigator

A new and powerful tool for banks to leverage in their battle for primacy.

Read more  ➔
PreMatch results are In

PreMatch results are In

We began beta testing our groundbreaking new solution for authorizing payroll accounts in Q1 2024. And we’re thrilled to share that the industry’s only 100% credential-less solution that automatically identifies users’ payroll accounts is living up to the hype.

Read more  ➔
How we achieve the industry’s best conversion rates

How we achieve the industry’s best conversion rates

Pinwheel Prime’s intelligent waterfall covers 100% of U.S. payroll scenarios and delivers 30% more successful conversions than any other provider in the industry.

Read more  ➔
Automated direct deposit is powering the next generation of growth for credit unions

Automated direct deposit is powering the next generation of growth for credit unions

Neo-banks like Cash App and Chime have mastered the art of digital onboarding, leveraging automated direct deposit features as a key driver of customer acquisition and long-term engagement. By investing in payroll integrations that deliver a seamless direct deposit enrollment option during onboarding, these fintech giants have grown their actively funded user base at hyper speeds.

Read more  ➔
Nassau Financial Credit Union Selects Pinwheel As Direct Deposit Switch Partner

Nassau Financial Credit Union Selects Pinwheel As Direct Deposit Switch Partner

Nassau Financial’s mission is to improve the financial well-being of each member in the communities we serve, reflecting the credit union philosophy of "People helping people."

Read more  ➔
Perpay increases direct deposit conversion rate for eligible users by 2.19x with Pinwheel PreMatch

Perpay increases direct deposit conversion rate for eligible users by 2.19x with Pinwheel PreMatch

Implementation of the Pinwheel Prematch feature took Perpay only 3 weeks, after which they saw an immediate performance uplift. For Perpay customers eligible for PreMatch, they saw a 2.19x increase to switch success rate, and an 11% overall switch conversion improvement.

Read more  ➔
Success rate for EECU’s deposit change feature improves by over 50% after switching to Pinwheel PreMatch

Success rate for EECU’s deposit change feature improves by over 50% after switching to Pinwheel PreMatch

Read more  ➔
SafeLink expands access to frictionless experiences

SafeLink expands access to frictionless experiences

In the ever-evolving landscape of banking and fintech, winning the primary banking relationship has never been more difficult. In our recent white paper, Primacy in personalized banking: a moving target, we reveal new consumer insights that emphasize the importance of offering seamless digital experiences to win and keep customers. 

Read more  ➔
Primacy in personalized banking: A moving target

Primacy in personalized banking: A moving target

Learn about changes to consumer behavior that have affected financial institutions' ability to achieve and defend primacy.

Read more  ➔
Industry leaders talk consumer bank switching behaviors

Industry leaders talk consumer bank switching behaviors

Are you curious about the latest behavioral trends in consumer banking? Do you want to know how top financial institutions are adapting to meet evolving customer needs? 

Read more  ➔
What drives primacy with today’s consumer?

What drives primacy with today’s consumer?

Discover what consumers believe is needed for bank account primacy, and what really motivates them to switch.

Read more  ➔
Why  are consumers on the move?

Why are consumers on the move?

See what's driving the acceleration of bank switching across generations.

Read more  ➔
The branch of the future

The branch of the future

With most banks focusing investments on digital and reducing branch networks, 60% of new accounts are still being opened in branch. For decades, bank branches have been a cornerstone of everyday life in America’s cities and towns. But these days, branches are getting harder and harder to come by. By the end of 2023, the number of bank branches in the U.S.

Read more  ➔
Giving credit where it’s due

Giving credit where it’s due

Are credit scores missing the point?Despite the lip service in banking pledging fairness and equity, systemic issues can allow discrimination in extending credit to surface in unexpected ways. One glaring example is the industry’s struggle to underwrite those who have non-traditional career histories or those who make their living through self employment or the gig economy. Whether they need to produce two years’ worth of tax returns or a specific credit score, many financially secure Americans still struggle to present the “right” paperwork. As a result, banks cannot deliver an optimal experience for:

Read more  ➔
Trust and Verify

Trust and Verify

Read more  ➔
Citizens & Pinwheel talk primacy

Citizens & Pinwheel talk primacy

A conversation with Chris Powell, EVP & Head of Deposits, Citizens Bank and Kurtis Lin, Co-Founder & CEO, Pinwheel. Last month, Pinwheel hosted a webinar with the Consumer Bankers Association to explore our latest research on The Power of Primacy conducted in partnership with The Digital Banking Report. In a discussion moderated by Pinwheel CMO, Crystal Gopman, Chris Powell, EVP and Head of Deposits at Citizens Bank and Pinwheel CEO, Kurtis Lin, delved deep into the challenges banks are facing today as they compete for share of wealth with the modern consumer. 

Read more  ➔
Be the Amazon of banks  

Be the Amazon of banks  

The next time you’re browsing on your phone, add this idea to your cart: Does your bank need to engage customers less like an overworked teller and more like Amazon?In a climate of exploding technology and regulatory scrutiny, the BAI Banking Outlook: 2024 Trends survey identified the customer digital experience as a top priority for this year, citing technology integration and intuitive platforms as the pathways to engagement that’s personal, frictionless – and even somewhat fun. But as you know, fraud mitigation and other protocols can introduce drag and result in user drop-off. “Somewhat unfairly, customers measure their bank’s digital delivery of services against the practices of world-class online retailers,” the survey concludes. 

Read more  ➔
Enhancing digital trust: Inside Pinwheel's commitment to security

Enhancing digital trust: Inside Pinwheel's commitment to security

Ensuring Digital Security in the rapidly evolving digital world, the importance of security cannot be overstated. As the Chief Information Security Officer at Pinwheel, I'm at the forefront of our battle against digital threats. Our mission is clear: to safeguard our clients' data with the most robust security measures available. This dedication is embodied in our two flagship products: Pinwheel Core and Pinwheel Prime.

Read more  ➔
Who’s making money moves in 2024?

Who’s making money moves in 2024?

Are your new customer acquisition goals higher than ever in 2024? Yes? Then, you’re on trend. Late last year, the BAI surveyed 102 financial services organizations to gain insights for the coming year. The findings of the study, the BAI 2024 Banking Outlook, placed customer acquisition in the top two priorities—just behind deposit growth—for bankers. Coming in third? You can probably guess. Enhanced digital banking experiences. And we’re here for it. 

Read more  ➔
New study confirms direct deposit unlocks primacy

New study confirms direct deposit unlocks primacy

The report highlights a significant disconnect between banks' customer acquisition strategies and consumer behavior. While banks continue to invest heavily in account opening incentives, such as cash bonuses and promotional offers, these efforts often fall short of their intended goal. To the dismay of banks, although they spend high acquisition costs to attract new customers, many of these accounts remain dormant.

Read more  ➔
Consumer bank switching behavior demystified

Consumer bank switching behavior demystified

My january piece on the offer wars got me thinking: what actually motivates consumers to switch banks? Are rich account opening incentives turning heads, or is our industry missing the mark? To answer this question, we partnered with Savanta research to understand the inner dialogue of a consumer contemplating a new banking relationship.

Read more  ➔
The metrics you care about the most are now available in real-time

The metrics you care about the most are now available in real-time

Pinwheel was founded to unlock powerful income data for financial institutions, so that they can better serve their users with more personalized products, driving long term relationships that are proven to deliver better financial outcomes. Introducing the Dashboard Activity Page for Real-Time Engagement Insights.

Read more  ➔
New Jack Henry partnership makes it easier for community banks to take advantage of Pinwheel

New Jack Henry partnership makes it easier for community banks to take advantage of Pinwheel

We are thrilled to announce Pinwheel's new strategic partnership with Jack Henry, a leading financial technology company, which gives their customers a fast path to implementation for the industry's top performing Direct Deposit Switching solution. This collaboration is set to revolutionize the digital direct deposit setup experience for accountholders at community and regional financial institutions.

Read more  ➔
 Pinwheel's CMO discusses bank competition for primacy in 2024

Pinwheel's CMO discusses bank competition for primacy in 2024

Banks rival top brands like Coke and P&G as the highest spending advertisers in the world. And bank marketing teams - channeling their best Cardi B energy - literally make money move with hundreds of millions of dollars at their disposal to hit annual growth goals. While the accounts keep rolling in, there’s a frantic scramble as institutions fumble in their attempts to convert active customers and meaningful engagement through aggressive, unsustainable offers. 

Read more  ➔
Hear from Pinwheel’s Chief revenue officer on growing profitably in 2024

Hear from Pinwheel’s Chief revenue officer on growing profitably in 2024

As the Chief Revenue Officer at Pinwheel, I speak to executives from the world’s top banks every day and I see first hand how rapidly the financial services industry is changing. With approximately 94% of the U.S. population holding bank accounts and a staggering 13 million new accounts opened in 2022, the competitive quest for primacy, or being the primary account for a customer, is more intense than ever. That’s why digital advertising spend is on track to close out 2023 by surpassing $30 billion.

Read more  ➔
Introducing the next generation of Automated Direct Deposit Switching

Introducing the next generation of Automated Direct Deposit Switching

Introducing our first-of-its-kind, reimagined automated direct deposit switching experience, expected to at least double end-to-end conversion.

Read more  ➔
Know Your Fraudster Q&A with Robert Reynolds

Know Your Fraudster Q&A with Robert Reynolds

Read more  ➔
Fraud Fighers Chapter 1: Know Your Fraudster

Fraud Fighers Chapter 1: Know Your Fraudster

Read more  ➔
This is how banks close the loop with branch guests: Introducing Pinwheel Smart Branch

This is how banks close the loop with branch guests: Introducing Pinwheel Smart Branch

Read more  ➔
Meet Pinwheel Smart Branch

Meet Pinwheel Smart Branch

Learn about how Smart Branch enables a new generation of integrated omnichannel campaigns.

Read more  ➔
Introducing Pinwheel Deposit Switch 2.0, a revolutionary upgrade that maximizes coverage and conversion for every US worker

Introducing Pinwheel Deposit Switch 2.0, a revolutionary upgrade that maximizes coverage and conversion for every US worker

Deposit Switch 2.0 allows every US worker to update their direct deposit settings regardless of where their direct deposit comes from.

Read more  ➔
Key factors to consider before implementing a payroll connectivity API

Key factors to consider before implementing a payroll connectivity API

Before integrating a payroll connectivity API, you should evaluate it based on coverage, conversion, implementation, security, and compliance.

Read more  ➔
Lendly improves its loan servicing with Pinwheel’s support

Lendly improves its loan servicing with Pinwheel’s support

Read more  ➔
Enhance credit line management with income data

Enhance credit line management with income data

Read more  ➔
See your customers’ earnings weeks into the future with projected earnings

See your customers’ earnings weeks into the future with projected earnings

Read more  ➔
Demo Video: Pinwheel’s direct deposit switching solution

Demo Video: Pinwheel’s direct deposit switching solution

Read more  ➔
How Pinwheel helped Perpay increase conversion by 29%

How Pinwheel helped Perpay increase conversion by 29%

Read more  ➔
How to reduce default risk with consumer-permissioned data

How to reduce default risk with consumer-permissioned data

Read more  ➔
Digital lending technologies and trends that are shaping the industry

Digital lending technologies and trends that are shaping the industry

Read more  ➔
4 technologies that improve fraud detection in banking

4 technologies that improve fraud detection in banking

Read more  ➔
Why automated income verification is a must-have feature for lenders

Why automated income verification is a must-have feature for lenders

Read more  ➔
December product release: 10% increase in conversion, enhanced security and access to pay frequency data

December product release: 10% increase in conversion, enhanced security and access to pay frequency data

Read more  ➔
A conversation with our Chief Information Security Officer

A conversation with our Chief Information Security Officer

Read more  ➔
Former CFPB Deputy Director Raj Date Joins Pinwheel as an Advisor

Former CFPB Deputy Director Raj Date Joins Pinwheel as an Advisor

Read more  ➔
Cash flow underwriting: Benefits & how to access cash flow data

Cash flow underwriting: Benefits & how to access cash flow data

Read more  ➔
Beyond the Credit Score: Propelling consumer finance into the future with income data

Beyond the Credit Score: Propelling consumer finance into the future with income data

Read more  ➔
Why banks need a payroll connectivity API that prioritizes information security

Why banks need a payroll connectivity API that prioritizes information security

Read more  ➔
How alternative credit data can benefit lenders

How alternative credit data can benefit lenders

Read more  ➔
Tech Spotlight: Implementing your first feature flag

Tech Spotlight: Implementing your first feature flag

Read more  ➔
Pinwheel Welcomes New Advisor, Ethan Yeh, to Advance Pinwheel’s Data Science Strategy

Pinwheel Welcomes New Advisor, Ethan Yeh, to Advance Pinwheel’s Data Science Strategy

Read more  ➔
Tech spotlight: Securing access control across internal services

Tech spotlight: Securing access control across internal services

Read more  ➔
Leading wealth management firm partners with Pinwheel to take its wealth-building solutions to the next level

Leading wealth management firm partners with Pinwheel to take its wealth-building solutions to the next level

Read more  ➔
The anatomy and potential of payroll data: Transforming complex data into insights

The anatomy and potential of payroll data: Transforming complex data into insights

Read more  ➔
Beyond the credit score: Propelling consumer finance into the future with income data

Beyond the credit score: Propelling consumer finance into the future with income data

Read more  ➔
Ayokunle (Ayo) Omojola joins Pinwheel’s Board of Directors

Ayokunle (Ayo) Omojola joins Pinwheel’s Board of Directors

Read more  ➔
Conquering conversion: Engineering practices developed to help customers

Conquering conversion: Engineering practices developed to help customers

Read more  ➔
Boost your direct deposit strategy with earned wage access

Boost your direct deposit strategy with earned wage access

A 12-page guide to leveraging earned wage access (EWA) to incentivize direct deposit switching.

Read more  ➔
Driving Customer Delight: From implementation and beyond

Driving Customer Delight: From implementation and beyond

Read more  ➔
Pinwheel Supports Open Finance Data Security Standard

Pinwheel Supports Open Finance Data Security Standard

Read more  ➔
How we design Pinwheel to solve real customer problems

How we design Pinwheel to solve real customer problems

Read more  ➔
What is consumer-permissioned data and what are its benefits?

What is consumer-permissioned data and what are its benefits?

Read more  ➔
How payroll data connectivity can help financial service providers in tumultuous market conditions

How payroll data connectivity can help financial service providers in tumultuous market conditions

Read more  ➔
Pinwheel now supports document uploads to supplement payroll data

Pinwheel now supports document uploads to supplement payroll data

Read more  ➔
Brian Karimi-Pashaki joins Pinwheel as Partnerships Lead

Brian Karimi-Pashaki joins Pinwheel as Partnerships Lead

Read more  ➔
Optimizing for conversion with smarter employer mappings

Optimizing for conversion with smarter employer mappings

Read more  ➔
What are super apps and how will they impact financial services?

What are super apps and how will they impact financial services?

Read more  ➔
Increase conversions and maximize share of wallet with Pinwheel's new UX update

Increase conversions and maximize share of wallet with Pinwheel's new UX update

Read more  ➔
Pinwheel announces support for taxes

Pinwheel announces support for taxes

Read more  ➔
Ryan Nier Joins Pinwheel as the Company’s first General Counsel

Ryan Nier Joins Pinwheel as the Company’s first General Counsel

Read more  ➔
The future of enabling earned wage access

The future of enabling earned wage access

Read more  ➔
The ultimate guide to automated direct deposit switching

The ultimate guide to automated direct deposit switching

Read more  ➔
Deliver earned wage access faster with Pinwheel Earnings Stream

Deliver earned wage access faster with Pinwheel Earnings Stream

Pinwheel Earnings Stream provides the necessary data and intelligence to reliably offer earned wage access (EWA) at scale.

Read more  ➔
Digital transformation in banking in 2022: What it means, trends & examples

Digital transformation in banking in 2022: What it means, trends & examples

Read more  ➔
June product release: Expanded connectivity to employers, a custom experience with Link API and more

June product release: Expanded connectivity to employers, a custom experience with Link API and more

Read more  ➔
Pinwheelie Spotlight: LaRena Iocco, Software Engineer

Pinwheelie Spotlight: LaRena Iocco, Software Engineer

Read more  ➔
How Perpay removed friction from its customer journey using Pinwheel

How Perpay removed friction from its customer journey using Pinwheel

Read more  ➔
Build fully custom experiences with Pinwheel’s Link API

Build fully custom experiences with Pinwheel’s Link API

Read more  ➔
Pinwheel expands connectivity to 1.5M employers

Pinwheel expands connectivity to 1.5M employers

Read more  ➔
Robert Reynolds joins Pinwheel as Head of Product

Robert Reynolds joins Pinwheel as Head of Product

Read more  ➔
Pinwheel obtains highest security certification in the industry

Pinwheel obtains highest security certification in the industry

Read more  ➔
Lauren Crossett becomes Pinwheel’s first Chief Revenue Officer

Lauren Crossett becomes Pinwheel’s first Chief Revenue Officer

Read more  ➔
Everything you should know about the role of APIs in banking

Everything you should know about the role of APIs in banking

Read more  ➔
Open finance: What is it and how does it impact financial services?

Open finance: What is it and how does it impact financial services?

Read more  ➔
How automated direct deposit switching benefits traditional banks

How automated direct deposit switching benefits traditional banks

Read more  ➔
Pinwheel Secure: Authentication optimized for market-leading conversion

Pinwheel Secure: Authentication optimized for market-leading conversion

Read more  ➔
Pinwheelie Spotlight: Elena Churilova, Software Engineer, Integrations

Pinwheelie Spotlight: Elena Churilova, Software Engineer, Integrations

Read more  ➔
May product release: Localization and downloadable pay stubs

May product release: Localization and downloadable pay stubs

Read more  ➔
How a payroll API can level up lenders and renters

How a payroll API can level up lenders and renters

Read more  ➔
The power of payroll APIs in consumer finance

The power of payroll APIs in consumer finance

Read more  ➔
Data Talks: Pinwheel’s Fortune 1000 coverage and top employer trends

Data Talks: Pinwheel’s Fortune 1000 coverage and top employer trends

Read more  ➔
April product release: Enabling connectivity to time and attendance data for 25M US workers

April product release: Enabling connectivity to time and attendance data for 25M US workers

Read more  ➔
Tech spotlight: Increasing engineering momentum at a systems level

Tech spotlight: Increasing engineering momentum at a systems level

Read more  ➔
How crypto exchanges can turn direct deposits into a fiat onramp

How crypto exchanges can turn direct deposits into a fiat onramp

Read more  ➔
March product release: Time and attendance coverage and Pinwheel's new online home

March product release: Time and attendance coverage and Pinwheel's new online home

Read more  ➔
Pinwheelie spotlight: Arianna Gelwicks, Tech Recruiting

Pinwheelie spotlight: Arianna Gelwicks, Tech Recruiting

Read more  ➔
What is payroll data and how it benefits proptech companies

What is payroll data and how it benefits proptech companies

Read more  ➔
Earned wage access: What is it and why does it matter?

Earned wage access: What is it and why does it matter?

Read more  ➔