How I Built EazyAL Check-in Links and Plugged Them into Airbnb (Flutter Developer Perspective)
When I started building EazyAL, I wasn’t trying to create “another PMS.”
How I Built EazyAL Check-in Links and Plugged Them into Airbnb (Flutter Developer Perspective)
When I started building EazyAL, I wasn’t trying to create “another PMS.”
I had a very specific problem as a host in Portugal. I was paying 20% of my Airbnb revenueand I didn’t even know what I was paying for. Also:
👉 Guests weren’t sending their details 👉 SIBA compliance was manual and painful 👉 Airbnb messaging was inconsistent
So I built a system where:
**Airbnb → sends a message → guest clicks a link → data flows into my backend automatically**
Here’s exactly how I implemented that, from a Flutter + backend perspective.
The Core Idea: Replace Conversation with a Link
Instead of building a chat-based flow, I made a deliberate decision:
Don’t depend on replies. Depend on clicks.
So the system became:
- Each unit gets a unique public link
- That link opens a mobile-first check-in form
- The form submits directly into my database
- The host never has to chase the guest again
Step 1: Generating a Unique Link per Property
In my database (Supabase), each unit has:
id(UUID)public_token(used for sharing)
Example:
units {
id: uuid
name: string
public_token: string
}
Then the check-in URL becomes:
https://eazyal.com/checkin/{public_token}
This avoids exposing internal IDs and keeps things clean.
Step 2: Flutter Web Route Handling
In Flutter (FlutterFlow in my case), I set up dynamic routing:
GoRoute(
path: '/checkin/:token',
builder: (context, state) {
final token = state.pathParameters['token'];
return CheckInPage(token: token);
},
);
So when a guest opens the link:
👉 The app reads the token 👉 Fetches the correct unit 👉 Loads the right context
Step 3: Fetching Unit Data (Supabase)
On page load:
final unit = await supabase
.from('units')
.select()
.eq('public_token', token)
.single();
This allows me to:
- Validate the link
- Show unit name
- Load any custom settings
Step 4: Building the Check-in Form (UX Matters More Than Code)
This part is critical.
I didn’t over-engineer it.
The form collects:
- Name
- Nationality
- Document ID
- Arrival / departure
But the key decision was:
👉 Make it feel like part of the check-in, not a legal obligation
So I structured it like:
- Welcome screen
- Simple inputs
- Progress feeling (fast completion)
- Reward at the end (Wi-Fi / access info)
Step 5: Writing to the Database
When the guest submits:
await supabase.from('guest_submissions').insert({
'unit_id': unit['id'],
'name': name,
'nationality': nationality,
'document_id': documentId,
'created_at': DateTime.now().toIso8601String(),
});
Now the host has structured, usable data instantly.
Step 6: Airbnb Integration (The “Manual Automation” Layer)
Here’s the important part:
I did NOT integrate with the Airbnb API.
Instead, I used something much simpler — and more reliable:
Scheduled messages inside Airbnb
The host just pastes the link:
Hi [Guest Name],
Please complete your check-in here:
https://eazyal.com/checkin/abc123
This is required before arrival and will give you access details.
Thanks!
And Airbnb handles the distribution.
Why This Approach Works Better Than API Integrations
As a developer, I made a conscious trade-off.
I avoided:
- OAuth complexity
- Airbnb API limitations
- Approval processes
And instead used:
- Airbnb’s existing messaging system
- A simple URL-based flow
Result:
👉 Faster to build 👉 More stable 👉 Easier for hosts
Step 7: Triggering the “Reward” (Access Info)
Once the form is completed, I unlock:
- Wi-Fi details
- Access codes
- Instructions
This is just conditional UI:
if (formSubmitted) {
showAccessDetails();
}
This single decision dramatically improved completion rates.
What I’d Do Differently (Honest Developer Notes)
If I rebuilt this today:
1. Add reminder automation
- If form not submitted → send follow-up via WhatsApp (Twilio)
2. Track conversion analytics
- Click → open → submit rate
3. Add partial saves
- Users drop off → recover data
4. Pre-fill returning guests
- Huge UX win
Final Thoughts
This wasn’t about building something complex.
It was about connecting three simple things:
- A link
- A form
- A distribution channel (Airbnb messages)
And making them work together seamlessly.
As a developer, this is one of those cases where:
The simplest architecture solves the real-world problem best.
If You’re Building Something Similar
My advice:
- Don’t start with integrations
- Start with user behaviour
- Build around what already works
In this case:
👉 Guests click links 👉 Airbnb sends messages 👉 Forms collect data
Everything else is optional.
View EazyAL link here
메타데이터
- post_id
- 70a65aaa0f45
- slug
- how-i-built-eazyal-check-in-links-and-plugged-them-into-airbnb-flutter-developer-perspective-70a65aaa0f45
- url
- https://medium.com/@smartstack/how-i-built-eazyal-check-in-links-and-plugged-them-into-airbnb-flutter-developer-perspective-70a65aaa0f45
- canonical_url
- https://medium.com/@smartstack/how-i-built-eazyal-check-in-links-and-plugged-them-into-airbnb-flutter-developer-perspective-70a65aaa0f45
- author_url
- https://medium.com/@smartstack
- status
- ok
- fetched_at
- 2026-07-11 13:37:47