Arriving in the Airtable Jungle

Hi everybody!

I’m new in Airtable and I really enjoy this tool. I watched some tutorials and read about Airtables functions. I tried things out, and what should I say, it works very well! Now I try to organize my company’s tasks but I don’t get a quite clear idea on how to do it. My problem is the amount of different tasks and things I need to add. I guess it is not very complicated for you guys, therefore I would appreciate some ideas and insights on how to structure my Airtable.

I’ll try to explain as clear as possible all the tasks and needs I have.
We are a content and marketing agency. That means we have two teams - marketing and content with different projects.

What I have already:

  • I have a clients table
  • I have a service table
  • I have a team table with the different team members and their skills and availability

The problem comes with the table of the projects:

Let’s talk about the content part. We create blog posts, whitepapers etc. for different clients. Some are occurring regularly and some just once. I need to create a content calendar where I see when we have scheduled articles, who is doing it, what topic, who is the writer - I managed to do all this. The problem is now that my data is in a huge list and I don’t have a good overview. I would like that I can separate them by client and month without creating 20 new tables. I want a list with all projects from the same month, but also from one client. I know there is a filter function, but I feel that is not good enough. I want to schedule my content for the rest of the year and I don’t know how to really organize the amount of information I have without losing the overview. To every article there is a lot of data and also billing information. I need to find a good way how to organize all of it.

Do you have a good idea how I could structure my Airtable in the right way?
Thanks for your help and time.

Welcome to the community, @Madeleine_Walther!

And welcome to the jungle! :guitar: :notes: :musical_note:

For managing your content, you definitely don’t want to create a bunch of extra tables, but what you will probably want to take advantage of is Airtable’s views, which lets you create different views that show you just the information that you need to see:

I cover views in depth in my free Airtable training course:

You may also want to start dipping your toes into Airtable’s interfaces as well, which could provide you with more clarity when you’re looking at your data:

If your company has a budget for these sorts of things, you may want to work one-on-one with an expert Airtable consultant (such as myself) to help you perfectly setup & structure everything in your entire base:

1 Like

Hey @Madeleine_Walther!
Welcome in!

These are kinda just some notes before we talk about your goal.

I presume it’s safe to say that you might have caught the Airtable itch.

You’re running into the biggest learning curve of Airtable.
Airtable provides you with so many possible ways to build, design, and configure your solutions, that it can quickly become overwhelming.

If you persist, then you will be able to build some remarkable solutions, but if you settle into trying to use Airtable as a spreadsheet, you will be disappointed and will probably quickly give up on it.


Now, onto your use case.

Here are the requirements I’ve gathered from your post:

  1. Clients: This table contains records for every client your company works with.
  2. Service: :question: Not really sure what this table holds, but I presume it contains records for every service that your company offers.
  3. Team: This table contains records for each team member in the company.

For the Projects table:

  1. Each record is for an individual project y’all are working on for a client.
  2. You want to be able to easily manage the project records by using data like:
    • What client was it for?
    • What month was it completed/started/etc?
    • What about both?

I had a bit of extra time this morning, so I went ahead and created a demo base that encompasses how I imagined what you described.

Everything in there is test data, so don’t worry about any PII or sensitive information if you want to copy the base into your workspace and copy different things.


Grouping

You’ll find the grouping solutions in the Projects table.
There are respective views for:

  1. All projects grouped by their associated client.
  2. All projects grouped by their associated year/quarter.
  3. All projects grouped by their client, and then sub-grouped by their year/quarter.

To group by the year/quarter, I wrote a quick formula that spits out a value based on the Due Date field.
It will provide you a value in a similar format to 2022 - Q1.


If you’d like, I can do a more in-depth walkthrough on how it’s all built, and I’d be happy to answer any questions you have or additional requests in this particular base.

Hey Madeleine,

You’ve been given some great advice!

Views in a single table are your friend!

Here’s how we manage content marketing at On2Air Airtable Apps. There are some screenshots and examples listed.

Hey ScottWorld,
thanks for your helpful answer. I’ll consider to have a one-to-one consulting once I set up the basics. Thanks for taking your time to help me out.

1 Like

Hey Ben,

thanks for your nice and long message and of course for the demo base. I’ll try to answer your questions and explain best I can what I did until now.

1+3. Clients + team:
Yes, this table contains all info about the clients: name, website, person in charge with mail etc. and the team members: position, name, mail etc.

  1. Service:
    We create articles, newsletters etc. So I have services like: newsletter1, newsletter2. etc. because of a different rate.The content table contains all kind of content we write such as newsletters, blogposts etc. I created there different view for each company.

The goal is now to get a monthly overview and create invoices, or at least a billing list. This means that each article is connected to a service. This service has a special rate. Now I would like to have a sheet where I can see which articles I did for which company in the month of XXX and how much I earned in total. I understand I have to connect to an invoice channel the client, the service and the month to create that, right?

For the project table/content table: I added due date but not the month, should I add a second date field?

I understand I can work with the grouping as well to solve problems. Have to study how it works exactly.

I actually have some questions to billing etc. Because I would like to add the rates of the team members to get a better overview of how much profit we make at the end of each month, but well…Let’s start with the basics.

Thanks for your help, that is amazing.

Thanks Hannah!

I will have a look into it.
Thanks for your answer and time :slight_smile:

Hey @Madeleine_Walther!

I will build out a couple of solutions to walk you through.
I’m in the middle of working on them; just wanted to give you a heads-up so you don’t think you’re abandoned!

Ben, that’s super nice of you! Looking forward to it. Thanks a lot!

Hey @Madeleine_Walther!

I’m sorry I took a while to get this back to you!
Hitting the weekend gave me enough breathing room to tie this up!

I got a bit carried away and just continued building within the demo base I shared with you.
Since I’ve been working on it, all the changes I show you here are also reflected in the demo base.

Again, feel free to open it and copy it into your workspace.

I do apologize for the density of this. I’m a huge believer in creating repositories of information for users. So the information here is for you as well as for users in the coming years that might stumble upon it and find that it greatly benefits them.

Because of the sheer volume, I’ll probably end up breaking this into separate posts. With each post, I’ll update the Table of Contents.


Table of Contents

Post One

  1. Clients & Contacts
  2. Services & Rates

Part Two

  1. Projects & Invoices
  2. Team Members
  3. Paying Up!

Clients & Contacts

Okay, I might be slightly misunderstanding this portion.
From what I understand, you’re using a single table to keep track of both your clients and your team members.

If you are, then here's a bit of context as to why that's probably not a good idea.

When thinking about a database, consider the data you’re storing.
More specifically, consider the ‘types’ of records you’re storing.

The rule of thumb is that you want each table to contain records for a single type of ‘thing.’

  • The Clients table → records for each client.
  • The Services table → records for each unique service.
  • The Projects table → records for each unique project.
  • etc.

This separation is critical when you begin to pump a lot of data into your database.

Imagine you’re keeping between 50-100 mixed record types in a single table.
With that many records, you can kinda pick out the data and interpret what you’re looking at.

The problem becomes painfully apparent when you add in more data than you can reasonably digest at once. This is where Airtable as a database becomes the foundation for you being able to manage and manipulate that information easily.
Airtable will only help you organize data if you feed it into a considered design. It will do a lot of the work, but only if you give a tiny bit of work at the start.

Besides having “dirty data” mixed up and disorganized, you become crippled by the inability to leverage linked records.
Establishing strong, consistent relationships between clean data is something that multi-billion dollar companies pay millions of dollars for their staff to do.

This entire base/demo solution would be impossible to implement without that clean separation.
Just something to keep in mind.

The other way to interpret what you described is that you have contacts that are associated with your client accounts.

There are some substantial advantages to keeping track of client account contacts.
I’ll highlight some as we go.

So I’ve created a new table called Contacts. Each record in this table is a person that is associated with a client.

Question: What is the benefit of doing this?

It depends.

One of the benefits of seeing which contacts are associated with a given account is that you can isolate a contact as a primary account owner. i.e., Your primary contact.

You can also indicate if a project has a specific person as your contact point. This can be useful if you’re working with an isolated team in a company.

In our scenario, I primarily added this table because it allows us to add flexibility when handling billing and invoicing, something I know you previously indicated that you wanted to explore.


Services & Rates

A quick note on the design I have below:

I wanted to explore and show you a few more nuanced ways to implement a billing and invoicing solution. With that in mind, I am adding some twists and additional ‘features’ that you didn’t explicitly state.
The two add-ons I placed are deposit and publishing amounts.
Just a heads up in case you are confused about why I added them.

This is excellent context!
I took a bit to explore this implementation and have an exciting approach to this requirement.

I first created a new currency field for you to set a flat service rate for your service records.
In addition, I have two formula fields that break down a 25% deposit fee and the total amount that remains minus that fee.

Here are the two formulas that power those fields:

  1. Deposit Amount
IF(
    AND(
        NOT(
            {Pricing Model} = "Free"
        ),
        {Rate Per Project}
    ),
    "Deposit Due: $" &
    FLOOR(
        ({Rate Per Project} * .25),
        0.01
    ),
    "Deposit Due: $0.00"
)
  1. Publishing Amount
IF(
    AND(
        NOT(
            {Pricing Model} = "Free"
        ),
        {Rate Per Project}
    ),
    "Due At Completion: $" &
    FLOOR(    
        ({Rate Per Project} - ({Rate Per Project} * .25)),
        0.01
    ),
    "Due At Completion: $0.00"
)

Question: What do we gain by building this information in this table?

Put simply… Rollup & Lookup Inc.

You'll see how it comes together as we go, but if you want to read a branch about it, click here.

Always remember: Tables contain records for each ‘thing’ we want to store information on.
It’s a fundamental design principle when working with databases. When you think about the implications of working by the principle, you eliminate duplicate data entry. If you find that you’re entering the same data more than once, then something is wrong in your workflow.

Some people might sit back and say, “Well, I’m just going to put that information somewhere else; I don’t need to put it here.” Did you catch the problem?

Your rates are attached to your service.

“Okay, cool. But I need that information in other tables.”
Using rollups and lookup fields, we can give a piggyback ride to data in other tables. Furthermore, we can transform and summarize that data in transit.

Here’s an easy way to visualize it:

In my demo base, I have unique names for each service.

In this example, if I wanted to have multiple “Marketing Plus” service records, I’ll want to duplicate the primary field, Name, to allow us to create a new primary field.

Why do we want a new primary field?

The primary field should have a unique value for each record.
To maintain “clean data,” you want to be able to uniquely them.
This is crucial when you start adding more and more information to your database.
If you have ten records with the same names, you will quickly run into problems.

So if we have multiple “Marketing Plus” records, but each has a different rate, how do I tell them apart?
We can use a formula field!

Here, I have duplicated the primary field and made it a single-select field.

Question: Why did you change the single-line text field to a single-select?

If we had to type “Marketing Plus” into each record manually, we would be breaking the golden rule of eliminating duplicate data entry.

Here’s the formula used in the new primary field.

IF(
    AND(
        {Service Name},
        {Rate Per Project} > 0
    ),
    "#" & {ID} & " " &
    {Service Name}
    & "\n" &
    "$"
    & FLOOR(
        {Rate Per Project},
        0.01
    ),
    IF(
        {Service Name},
        "#" & {ID} & " " &
        {Service Name}
        & "\n" &
        "Free Tier"
    )
)

Part Two

Return To: Table of Contents


Projects & Invoices

When exploring this part of the base, I wanted to find a way to build something that would highlight some of the dynamic ways you can implement an invoicing and billing system.
I’ll reiterate that I’m taking a few intentional deviations from your requirements for the sake of exploration.

I had to sit on this for a few hours.

The most straightforward thought I had was to simply use a pivot chart to allow us to break down that information.


As a side note to this question:

You only need a single date field to implement these:

Click Here To See How

One of the coolest formula functions within Airtable is the DATETIME_FORMAT function.
It allows you to take a single Date/Time field, and format it into an almost infinite number of permutations.

You can find a list of the possible formatting tools here

If you look at the previous image, you’ll see the two formula fields.
Both of those fields are referencing the Due Date field.

Here’s the formula for the ‘Project Quarter’ field:

IF(
    {Due Date},
    DATETIME_FORMAT(
        {Due Date},
        'YYYY'
    ) & " - " &
    'Q' & DATETIME_FORMAT(
        {Due Date},
        'Q'
    )
)

And here’s the formula for the Calendar Tag field:

IF(
    {Due Date},
    DATETIME_FORMAT(
        {Due Date},
        "MMM YY'"
    ) &
    ' - Q'
    &
    DATETIME_FORMAT(
        {Due Date},
        'Q'
    )
)

If you open the above link to the Airtable DATETIME_FORMAT specifiers, you’ll see that we can actually mix and match the specifiers to build custom formats. It’s hard to properly explain, so here’s a comparison:

MMM YY'Mar 21'
- Q'- Q1'
YYYY2021

So if we have a date of 3/1/21, then when we format that into MMM YY', then we will get
Mar 21'.
Per the specifiers, if we format it into LL, we will get March 1, 2021.

Again, it’s pretty much a virtually unlimited number of permutations.
I recommend playing around with it.

Playing around with it will allow you to group records by any sort of date format you’d like.

You will notice in the screenshot above that the groups aren’t chronologically in order.
It’s a quirky behavior in how Airtable handles sorting and grouping. If you do actually want them to be properly grouped and sorted, there’s a small workaround if you’re curious to see it.


At this point, I was super curious to push the boundaries on solutions I’ve built before.

Remember this from the first post?

We can now reap the benefits of setting ourselves up in our design.
Before I show you where it comes together, I need to quickly stop at our Team Members table because you pointed out that:


Team Members

Return to: Table of Contents

This table was a lot of fun to explore.
As you might be able to guess, this table contains records for each team member that you might have.
You’ll find any information about a given team member here, ranging from their position/title, billing rate, email address, primary phone number, address, etc.

Additionally, you can also pass in their preferred profile picture. Doing this allows you to do some really cool things when you start looking at page templates for invoices or automations.

When you start organizing your staff with things like their position/title, you can even easily identify and handle your contractors/freelance team members.

Here’s a quick example of that.
Using a quick formula field, I can summarize freelance/contract information allowing for quick and insightful glances at the contract and work history of a given individual.

This also allows you to play with implementing a company/team directory.

As per usual, all data you see is test data generated for this purpose.

Now that we’ve done an initial glance at what’s here, let’s take a look at some of the nuances that build the overall workflow.

Writers & Support Positions

Return to: Table of Contents

Let’s say you need to identify the writer of a given project.
While a project might have multiple people working on it, there is a primary writer that takes ownership of the actual content.

For example, I can have a project with an editor, designer, and planner. Those are in addition to my assigned writer.
Since the writer serves a critical role in the project, we might want to isolate them as being the writer.
While this makes for slightly better sorting and organization, it also lets you go in-depth with how your billing and invoicing behave.
We’ll touch back on that later.


Now that we’ve filled in the billing rate for each team member, we can use that information to build our billing and invoicing.

In my example, I have them billing per project.
There will be slight permutations in how things work if you bill by a different metric, such as on a time-based method.


Paying Up!

Return to: Table of Contents

We have two sources if you sit back and think about where all the information comes from regarding rates and prices.

  1. Billing by service
  2. Billing per team member

Those two pieces come together at a central point. When working with data design, you might hear these referred to as junctions.

Just because we have information pumping into a single point does not mean that we can just call it a day and hope that it all works out fine.
We have to synthesize that information to properly support our workflows.

We’re now at the point where it comes full circle.

Rollup Galore

Remember that rollups let us take a bunch of data from other sources and transform or summarize it in a different location.

In this case, we want to work with the billing/service rates from both our Service and Team Members table.

To start, I’m going to create a rollup from the Service table.

This will give us the rate as shown in the service table.

Now we need to handle the billing for the team members that are assigned to the project.

Remember this?

Since the writer serves a critical role in the project, we might want to isolate them as being the writer.

It will come in handy now.

Look carefully, and you’ll see that I actually have two linked record fields to the Team Members table.

The difference in the fields is that the Writer linked record field only allows us to link specifically our writers in this field.
On the other hand, the Team Members field allows you to assign anyone who is not a writer.

Here’s the thinking behind that choice:

There are situations that I’ve worked with in the past where the billing of a writer or principal staff member needs to be handled differently or called out differently from the rest of the other staff on a project.

This also allows you to clearly identify how much of the overall invoice amount is paid towards the writer or staff member that owned that particular project delivery.

I apologize for the image compression.

Here’s a crude explanation of what you’re seeing.

  1. Service Rate → From Service Table. It’s the flat rate on a service.
  2. Team Rate → The combined rates for all of the non-writer staff on the project.
  3. Staff Rate Total → The combined rates of the staff plus the writer’s rate.
  4. Invoiced Amount → This is a field that you type the final charged amount in. This allows you to have the final say and control over project invoicing. There are ways to automate this, and I’m happy to show you if you’d like.

There could be a ton of different things that might be added to the invoice amount.
I’ve enjoyed using a simple note field to note down additional things.


When you take all of this work that we’ve done, you can do things like fuel some dope document generation without having to do any duplicate data entry.


Recording Payments

Return to: Table of Contents

You may have noticed that I have a single-select field that shows the status of the invoice.
Let’s say that when you get a new project, the client needs to pay the 25% deposit fee of the flat rate service fee.

The remaining invoice amount will be due when the project is completed/published.

To show this off, I will create a new project record and show you the invoice/billing workflow.

Here’s my new project record. I have added my client, my writer, and my team members.

Now, since I’ve added my team and I’ve added the service that this project is based on, all my billing information is present and has automatically filled in.

Since the project is new and is in planning, the only balance that’s due right now is the deposit amount.

Here’s the Balance field:

Balance: $171.25
Total Paid: $0

Here’s the Billing Breakdown field:

Service Rate: $685
Staff Rate: $581
Invoiced Amount: $0.00

Here’s the Deposit Amount field:

Deposit Due: $171.25

Here’s the Publishing Amount field:

Due At Completion: $513.75

Okay great! We have our billing information!
Now that we have our invoice calculations, we can run our deposit invoice!

I’ll go ahead and input the amount that I want to run the invoice for. From there, I can click my Invoice button.
Airtable will then fill in all the record data into the template I created.

I’ll go ahead and add this invoice to the record for record keeping.

You can then send the invoice to your client or client contact.
If you’d like, I can show you how to build an automation that sends out your invoices to your contact for you.

So what happens when your client pays the invoice?
We need a way to record our payments and update our billing information.

This is where we see the new Payments table!

Each record in this table is for each individual payment made by a client.
We can designate payments that are being processed, processed, whether they are for deposits or for completed projects, etc.

We’ll imagine that our client has paid the invoice we sent them.
So we will create a new payment record and fill in the information.

Since we link our project to our payment, our balance is now $0.00

You can also see that our Balance field now shows a zero balance and that the deposit has been paid.

What happens when the project is completed or published?

Now that our invoice is due, we can update our invoice amount to the final billing amount.

I’m going to enter in a ballpark-ish number for our final invoice amount that takes into account all of our staff billing rates and service balance.

We can then run our final invoice and issue that to our client.

And when they pay, you can just record it as we did before!


A quick note on reporting:

A small side-exploration I did was create a table that breaks down your months/years/quarters.

It allows you to see which clients did business with you that month, the number of projects, and the total revenue for that time period.

I didn’t explore it much, but we can explore it a bit more if you want.

Return to: Table of Contents

woooow, this is amazing.
just going through everything. will be back on this in a bit.

This topic was solved and automatically closed 15 days after the last reply. New replies are no longer allowed.