- Makers Make by SaaSykit
- Posts
- Laravel 11.39-41, Laravel Best Practices, The $1M ARR Growth Playbook & more
Laravel 11.39-41, Laravel Best Practices, The $1M ARR Growth Playbook & more
Hey Makers,
The past two weeks were packed! Laravel dropped three releases back to back, keeping us all on our toes.
Meanwhile, over at SaaSykit, we shipped SMS verification for trials without payment details, a much-needed safeguard against abuse.
Plenty more to dive into, so let’s get started! 😍
Laravel 11.39-41 released 🚀
3 releases mean 1 thing, tons of new of features have been added to Laravel. Here is a short rundown of the most impactful of them.
Fluent Date Validation
A new Date rule allows for flexible, chainable date validation.
use Illuminate\Validation\Rules\Date;
public function rules()
{
return [
'event_start' => ['required', new Date],
'event_end' => ['required', (new Date)->after('event_start')->before('2026-01-01')],
'dob' => ['required', (new Date)->format('m/d/Y')->beforeToday()],
];
}
Dump Helpers for Laravel's HTTP Client
New debugging helpers for HTTP client responses.
$response = Http::get($url);
$response->dump(); // Dumps full response
$response->dumpHeaders(); // Dumps only headers
$response->dd('data'); // Dumps and stops execution for 'data' key
Pending Attributes in Eloquent
withAttributes()
adds default attributes to queries and model instances.
public function archivedPosts(): HasMany
{
return $this->posts()->withAttributes('archived', true);
}
public function scopeArchived(Builder $query)
{
$query->withAttributes('archived', true);
}
UseFactory Attribute for Model Factories
Explicitly define a factory for models outside the default namespace.
namespace App\Domains\Comments;
use Database\Factories\CommentFactory;
use Illuminate\Database\Eloquent\Attributes\UseFactory;
#[UseFactory(CommentFactory::class)]
class Comment extends Model
{
use HasFactory;
}
Report and Log Options for Filesystem
Newthrow
andreport
options for filesystem error handling.
'disks' => [
'backups' => [
'driver' => 'local',
'root' => storage_path('backups'),
'throw' => false, // No exceptions
'report' => true, // Log errors
],
],
Prevent Destructive Rollbacks
Prevents rollback commands from causing accidental data loss.
DB::prohibitDestructiveCommands(true);
Support for phpredis Backoff and Max Retry Options
Adds configurable backoff and retry settings forphpredis
.
New At SaaSykit

Laravel is a powerful framework designed to simplify building modern web applications. Like any framework, it has best practices embedded in its core. By following these guidelines, you can write cleaner code, minimize technical debt, enhance team collaboration, and ensure your codebase aligns with the "Laravel way" of doing things.
In this article, we’ll explore these essential Laravel best practices, from structuring your code to optimizing database operations, ensuring your projects stay efficient and developer-friendly.
From the Community
Pipeline cleanup gets more elegant in Laravel with the new finally method. This addition simplifies how you handle post-pipeline operations, whether your pipeline succeeds or fails.
Managing cleanup operations in pipelines traditionally required wrapping your pipeline in a try-finally block. Laravel's new finally method streamlines this process by integrating cleanup directly into the pipeline chain, making your code more readable and maintainable.
Laravel’s Tinker package is a powerful REPL (Read-Eval-Print Loop) tool that allows you to interact with your Laravel application from the command line. It’s a great tool to test your application’s code without having to go through the hassle of creating a new controller or a route.
Once installed, you can essentially run the Laravel-specific code just by invoking the php artisan tinker
command in your terminal. However, writing code in the terminal can sometimes be cumbersome, especially when dealing with multiple-line code.
Working with address data requires continual updates. Our in-house ETL, built on Laravel and SQLite, helps us expand our address point data on a daily basis.
Addresses aren't static. New developments may necessitate new streets or splitting parcels, resulting in new house numbers or a streets getting a new name. So how do we keep all of our address data up-to-date?
It starts with almost 3,000 distinct data sources and an in-house data pipeline.
Laravel's View::share method provides a straightforward way to make data available across all views in your application, perfect for handling global settings, user preferences, or common UI elements.
When building Laravel applications, you often have data that needs to be available in all (or most) of your views - things like user information, application settings, navigation menus, or footer content. While you could pass this data from each controller to each view, that would lead to repetitive code. Laravel's View::share method solves this by allowing you to define data once and make it automatically available in all views.
In most applications, administrators need a way to manage data. Whether it's a blog's articles and comments, a store's products and orders, or a theater's events and tickets, admins need a place to list, create, edit, and remove records.
Joins are a powerful tool in Laravel's query builder that let you combine data from multiple database tables. Whether you're building a simple query or something more complex, Laravel makes it easy. This guide walks you through the basics of joins, explains when to use each type, and provides clear examples.
I've been working with Laravel for almost eight years, and I think I know Eloquent pretty well. But for a long time, I didn’t fully understand what happens under the hood when accessing properties on a model instance—and I’m sure I’m not the only Laravel developer who felt that way.
Laravel's Number helper now supports configurable default currencies, simplifying price formatting across different regions and use cases. This enhancement is particularly valuable for applications serving international customers or handling transactions in multiple currencies. Instead of manually managing currency symbols and formats, you can now leverage Laravel's built-in formatting with configurable defaults.
All about SaaS
What a last few days in AI land! DeepSeek came out with R1 and it created huge ripple effects in the tech world, maybe culminating with the DeepSeek app shooting up to #1 in the app store (is this real? The result of bot farms downloading in mass?).
What is DeepSeek? DeepSeek is an AI company that focuses on distilling large, complex AI models into smaller, more efficient versions (while also adding in their own research breakthroughs). These smaller models retain much of the capability of the originals but are cheaper and faster to use. And they released their R1 model last week. R1 is a reasoning model, designed to excel at tasks requiring logical thought, problem-solving, and decision-making. And it’s pretty good!
If your paid advertising campaigns are stagnant or generating the same results that don’t align with your revenue goals, know there is room for improvement.
And the easiest way to hack that “room for improvement” is by analyzing what your competitors are doing and by outperforming them. We call it competitive advertising.
Digital advertising is one of the most competitive arenas in modern business. With billions of dollars being poured into paid advertising platforms like Google Ads, Facebook, and TikTok every year, the competition for consumer attention is fierce. It’s not just about running ads anymore — it’s about running them smarter, faster, and better than your competitors.
In this edition of The Product-Led Geek I’m publishing an excerpt from Chapter 5 of Dave Boyce’s upcoming book ‘FREEMIUM’. I wrote this chapter with Dave and it focuses on the practicalities of building impactful growth functions.
Todays post will take 4 minutes to read and you’ll learn:
Why a Product Growth Model should guide all growth initiatives across teams.
The five growth motions from no-touch PLG to dedicated-touch account-based sales that drive business success.
Why your growth team's success depends on company-wide alignment rather than isolated efforts.
Fall 2013
I was 24 years old and had just moved to New York City.
I knew I wanted to start a startup, but none of my ideas until that point were going anywhere.
To pass the time, I started teaching online courses on Udemy with my buddy Conrad.
We scaled this to a couple of thousand dollars a month in revenue, but since Udemy took 50% of our sales and cross-sold other courses to our students, we found it hard to grow beyond that.
Videos
Keep building, keep rocking! 🤘