← Back to list

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.”

Daniel Xav De Oliveira · 2026-04-02 19:20 · 2 claps · 2.7 min read
#airbnb #eazyal #alojamento #portugal
Open on Medium ↗
Wiki topics: 📱 · Mobile Development

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:

  1. Each unit gets a unique public link
  2. That link opens a mobile-first check-in form
  3. The form submits directly into my database
  4. 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:

  1. Welcome screen
  2. Simple inputs
  3. Progress feeling (fast completion)
  4. 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