Vincent Ritter

< back to projects

Sublime Ads

A privacy focused ad management service for your apps, websites and others.

Sublime Ads is a platform to allow you to manage and serve your very own ads in your own apps, on your websites, or other services using a simple API, or a lightweight drop-in JS script. You are in complete control on what you want to show, and how.

Everything is in one place and is easy to manage, no need to write your own custom solution. On top, Sublime Ads is privacy conscious to you and your users. Only taps/clicks will be registered for served ads and nothing else (can also be disabled per ad). I also don't use any tracking for the web application and other things, just like the internet is supposed to be.

Launching as an MVP product, very soon, to satisfy my very own needs as a developer with multiple apps and sites.

Visit the website here.

Project posts

I’m using ActionText with the awesome Trix editor for Sublime Ads… so you can add some nice stuff for your ad content - thought it might be useful to add basics to it.

Did a bit of tweaking to the Sublime Ads holding page… it was using the application JS files, which I didn’t want. So now it’s under a ~100KB page load with only a few basic things.

Also made a few things… PINK. Looks bad on this image due to compression… but it’s 🤩

So this works nicely now!

Now just to sprinkle a bit of JavaScript on it, to make it super smooth.

Sublime Ads - Categories

It's taken me a bit longer to get to this point. Mainly because my brain just had to defuse somewhat and work on something else.

However, the categories section is now complete as far as I can get it, without the ads work being done yet.

What are categories

The categories are a way for you to essentially group your ads, giving you an easy way to organise stuff on how you see fit. It really is up to you.

The way I see it:

Categories can be anything from sub-categories, within a podcast or feed reader app, or they can be a way to separate your ads to your apps, sites and services

That means, do what suits you best for you scenario. You might have a few websites and apps and you want to separate out on what you want to show on which.

If you have a feed/podcast app you can have different categories according to your own feeds. For example: "Art", "Nature", "ROFL", "David Hasselhoff".

The idea here is that you can target each individual category when calling the API, so only Ads are returned within a given category.

Categories are optional and you don't have to use them if you don't want to. You can be as messy as you want.

Category view and creation

The categories view is super simple for now, with a minimum feature set just to keep true to the MVP idea. This is only a first step of many things I want to do. So if you feel it's lacking... don't worry.

When you first start, you'll see a super simple add button and an explanation what they're all about.

Simple enough.

Pressing "Create new" will take you to the form. It's simple for now.

Give it a name and an optional description. As easy as that. The description is used just for you internally, so you can give yourself a hint of what lies within.

Again, I show a hint of what a category can be.

Once you have added it, it's saved. The category page is updated and you now get a nice list view with a few extra details:

Let's zoom in...

Category list and details view

A nice table with simple info for you. Of note, each category will have an ID associated with it. This is used for the API if you wish to return ads just for that specific one. In the category detail view, shown in a moment, you can select it and copy it quite easily.

So, we have a name, an ID, your description. Then I'll also show how many active ads are tied against the category. They're showing "0" because I need to add the actual ad functionality as my next step hehe.

Next we have a status indicator; you may pause any category. That means it won't return anything from the API. Useful.

Then we have a few action buttons to suit your needs.

Before I move on... everything works on smaller screens too:

Yay!

Tapping on "View" will take you to the detail page. This is still very sparse at the moment, as I need to work on the ad functionality. My plan is to show linked ads and perhaps some basic stats (if enabled).

Here it is:

Tapping the ID will select the whole number so you can easily copy and paste it.

If you have a description that will show underneath... and you will also see the current category status. The edit button takes you to the edit form, similar to the create one… there you’ll also be able to pause it.

Again, that's just real simple but to the point where I want it for now.

Wrapping up

I'm quite happy with this section so far. Now the real works starts with adding the actual Ad functionality to the app.

There are plans to add a bit more flexibility to categories, for example expiry dates and the amount of ads each category can hold. So for example if you want to sell 5 ads per category, you could set that. However, this will be something I add after the initial launch.

Another thing I slowly need to think about is the dashboard and documentation. I made small steps in this area already...

I’ve been exploring some documentation static site generators and landed with VuePress. I can write in Markdown and I don’t have to worry too much about styling. Looks really great and is fast. I’ll be using it for Sublime Ads and probably everything else.

Also… you don’t have to use categories if you don’t want to. It’s totally optional.

Just to give you some idea how you could use “Categories” within Sublime Ads:

That’s how I would use it. I’ll do a bigger writeup when the time comes.

Hopefully I’ll spend one more evening/day on the category view for Sublime Ads, and then I’ll move onto the Ads themselves. I estimate a good week just for the Ad implementation. Then I need to get the API going too. Then I can invite people that are on the list!

Whoops! Thankfully I spotted my grave coding mistake whilst still working on it… by pure chance. Ah the joys. 😅

Category list view for Sublime Ads. Still very preliminary…

Slowly started working on the Categories view for Sublime Ads. Just getting started, and still loads to do. Here is the initial state… which no doubt I will tweak at least 50 times.

Fixed a few issues with the billing side on Sublime Ads. One service I was using for VAT rates was unexpectedly shutdown without any warning. Huge shame. Now I’m using something else though and it’s all working again.

Oh, don’t mind me adding even more language strings to my web app… and if you know what you’re looking at, you can see there is a lot there already and only covers 30% (or 100% of what I’ve built to date) of the app.

Made a few more tweaks to the billing section, on Sublime Ads, today. Address details can be changed now and also added a few more wording tweaks, like adding the price for your upcoming payments. Of course it all depends on your VAT status etc too.

Sublime Ads - Billing galore

Not going to lie, when I first thought of integrating billing, I thought it should be relatively straight forward given that my chosen payment provider would do everything for me.

Unfortunately that was not the case. I won't go into more detail here as I already wrote about it. Long story short, I went and integrated Stripe.

Tax nightmare

When you're a EU based business, things get complicated. Invoices have to be correct, they need to show the correct data and on top you need to make sure VAT is paid correctly for customers based in Europe. And if you want to make sure to charge customers the VAT rate for their country, things get even more complicated.

As I had to integrate payments myself, see above, I had to make sure I have all the data needed so I can keep the accountant and relevant tax authorities happy. As a one person business it's an absolute nightmare... but it has to be done. There is no choice. There of course was an easier option, but that would lead to a bad customer experience - so I decided not to do that. Instead I built a system that I can work with to file my proper returns, without doing too much manual labour.

So... let's get started with the lowdown.

Subscription

Sublime Ads is a subscription based business, which means it won't be free. I want to build something that I can sustain long-term, whilst at the same time sustain my own business models.

I decided that I will keep things super simple and there will be only one price to pay. There won't be upgrades or "team" account upgrades etc... Just one small monthly price.

At the start, I will keep it at a lower price point - gradually increasing the price as I go and add features. For anyone signing up early will always benefit from the price when they signed up (if you haven't cancelled). So no upgrades, no taking away features because you're on an early plan. Too many times have I seen that bullshit. That's not going to happen here!

Whilst I want to announce this next bit in a dedicated post, I'll give a hint here:

If for some reason you sign up but find yourself in a circumstance where even a small monthly payment is too much, it's my promise that I will waive fees for you - either by a discount or just a couple of free months. I know what it's like, I was there... and perhaps even will be there - nothing is a given. We are all human. We all have problems. And we all sometimes have money problems.

Taking a payment

I didn't want to take shortcuts with the billing section, even though it's something you touch once and then never look at again!

When you first start, you'll have a 30 day trial - no questions asked and no limits - no upfront credit card information needed. You don't have to pre-authorise your card when you walk into a shop, so you shouldn't have to do it on a web app - those things are only in place for people that forget at the end to cancel! Nothing like that here I'm afraid.

When you're ready, you can go over to the billing section. Depending when you do fully convert to a paid subscription, it will apply any trial days remaining and charge you at the end, or if there are less than 2 days remaining, or it has expired, it will go ahead and charge you straight away - for one month.

Filling out the form is straight forward, just your name and your billing address. I'll need this, because of my EU business presence. Plus it makes it more secure for me.

If you're based in the EU, I'll work out the correct VAT rate on the fly. This will get applied to the base price (to be decided).

Here is an image of what shows up as you enter your country and it's within the EU. In this case 23% on top the base price. I also give you precise information of the breakdown. I don't want to cheat you.

I do have the facility to add a VAT number to your account. This is an automatic process and will verify accordingly if it's valid or not. I'll mention more about that below, however here is what that would look like:

(Note that I changed my own VAT number to something random)

If you're in the EU, you know what that means.

Next, we want to subscribe. Payments are taken via the Stripe Checkout, as I quite like it. Stripe then talks to the web server via signed Webhooks. All quite cool in my eyes and it's been awesome working with the API.

Here is the subscribe button:

There is a little bit of information below the button. That's there just to confirm when payments will start (when on a trial) and also some more info about payments and EU VAT.

We then land on the checkout page:

I love the UI here and it's very clear what you're paying for. Stripe will also make sure to collect payments if a European card ever has to re-authorise later on. It's called Strong Customer Authentication, also know as SCA, if you're wondering. Not something I wanted to integrate as well. Stripe will take care of it and do the necessary things and talk to my web app at the same time. This probably saves me a good few days.

There were a few payment gems available that I could use for this, but I built it myself - because that's how I learn. Not to mention I need a few extra fields for reporting purpose.

You're subscribed!

Success! You're in! Now the fun starts.

The billing page is updated accordingly and gives you a few more things to do. First up is a confirmation of where your account is standing:

Simple enough. The wording changes depending if you're still within the trial period or not. Just a subtle change.

From there you'll be able to update your card details. I'll need to add the ability to change your address also... now that I think about it!

As you've subscribed, invoices will now become available. I left this quite simple but informative enough:

Depending on the status, the colour changes. If I ever refund one, that will also be reflected here. Pressing on "View" will go to a special link on Stripe where you can grab what you need. Stripe will also handle emailing these to you.

Oh, and everything of course is encrypted... here is my local data for invoices:

VAT

If you have a VAT number, you can get in touch so I can add it to the account. Once active, and verified, on your account, you'll get an email from Sublime Ads saying it's all there:

Again this is just specific to EU based customers. Every individual comes in different sizes and shapes and thought it would be useful.

There will be an extra section in your account too, just to confirm it's there:

I want to CANCEL

I got you covered here too, nothing too exciting here and the screenshot will do what it needs:

Again I want to concentrate on the wording more. Pressing cancel will in effect stop the subscription from renewing at the end of the current billing cycle.

If you decide to resubscribe, you can do so too:

Again the wording changes accordingly on the current account status. Resubscribing is as easy as pressing the button and will give you a bit more info before you commit.

If you do cancel, the app will tell you when it expires in the header too:

I won't email you to bug you about it. I get it!

Closing thoughts

I spent 1.5 weeks more on billing than I wanted to, but I'm super happy with the results and the flexibility. Sure, there will be edge cases, but I'm not too worried as the web app is manageable and I can fix things, where needed, quickly.

The design is still simple and I'm happy with the wording throughout the billing section. Again I'll tweak as I go.

Billing is a feature, so it was important to get it right. Without billing, there will be no web app... no business. I'm happy I tackled it now rather than later on.

For the next week I'm going to be finally working on categories and ads themselves. Pretty excited.