The big change in this release is a task which revokes paid campaign authorization from publishers who don’t show an ad for 60 days. Publishers who lose this authorization will be notified and have to re-apply.
Backward incompatible changes¶
Campaign object had a
publishers attribute which controlled which publishers
were eligible to fulfill an advertiser campaign. This had become unwieldy long ago (deprecated pre-1.0)
because each time a publisher was added, we needed to add them to a number of campaigns.
Instead, we added the concept of publisher groups.
This change finally removes the
campaign.publishers attribute and ONLY uses publisher groups.
May 15, 2023
This release contained some dashboard UX improvements like a live ad preview and some minor internal refactors.
April 11, 2023
This release fixes some math on renewals that happened when we moved to non-day flight durations.
April 5, 2023
In this release, we changed some flight prioritization and pacing defaults. New flights will weight which ads to show based on the CTR. In addition, we’ll be defaulting to hourly pacing which we introduced in v1.10.0.
March 14, 2023
The migration in this release just adds precision to daily aggregation tables. We simplified the CTR weighting introduced in v1.11.0 that prioritizes ads. We made a UX-only change to make disabled ads very obvious.
March 7, 2023
As in v1.10.0, the staff publisher report now uses the optimized table that only has data on publisher paid impressions. This makes it MUCH faster but slightly less flexible. The same caveat about adserver.tasks.update_previous_day_reports applies.
We also added an experimental feature around automatically prioritizing the ads within a flight. With the option enabled (default is off), higher CTR ads will be shown at a higher rate.
March 1, 2023
The biggest change in this release was to add the option to pace ads for a flight over a period shorter than a day (eg. an hour). This will improve the ability to balance a flight across geographic regions. For example, a 10 day flight targeting North America and Europe will attempt to fulfill 1/240th of the flight per hour which will better allow both regions to fulfill a part of the flight. This may become the default in a future version.
There were also a few reporting and aggregation changes:
- Adds another optimized aggregation table for paid ads for publishers
- The staff all advertiser report now uses the optimized advertiser aggregation
- Due to the index and report changes, it is recommended to run adserver.tasks.update_previous_day_reports across the life of your server. Otherwise, you may have some days without data.
February 21, 2023
Fix a minor reporting issue created in v1.9.0. Also show a link to a report but only to staff for now (the report is available to all advertisers but not useful to all of them).
February 1, 2023
This change adds some additional tables to speed up looking up basic publisher and advertiser metrics. These tables are calculated about every half hour in production. Some additional graphs were moved to metabase.
January 31, 2023
Fixes a node dependency issue with the previous version.
January 17, 2023
Most of the changes in this release related to our ML model. There was a new version of the model with additional data. The model was also moved to its own repository https://github.com/readthedocs/ethicalads-model. This release also contained a number of dependency upgrades.
January 17, 2023
This release contained some performance improvements to reporting and data aggregations as well as some minor fixes.
November 28, 2022
This release has a number of changes and fixes to the analyzer to try to fix some celery issues around repeated tasks and making our tasks reentrant.
November 2, 2022
This release contained some minor fixes and the larger change of splitting our task queue into analyzer tasks (of which there are many and they can backup the queue).
October 26, 2022
This release contains a migration to allow us to cache ads for a publisher for a configurable amount of time instead of the default (5s in prod).
October 16, 2022
This release made a number of contextual targeting model improvements including more resources spent on training and some improvements around testing the model and language detection.
October 13, 2022
This release fixes some minor bugs, makes some logger changes, and makes some small changes to user messaging.
September 8, 2022
Fixed a minor bug with the v1.1.0 release.
August 11, 2022
This release had a number of small changes such as some additional security logging, moving some reports to Metabase for performance purposes, and the ability to authorize users for publishers.
August 11, 2022
The big change here is to use our topic analyzer/ML model as part of our ad decision process. This is a huge milestone and we’re making this our v1.0.0 release!
July 21, 2022
The large change in this release is to add a machine learning topic classifier that uses a custom trained model. This release also contained minor dependency updates and bugfixes.
July 18, 2022
This release has a few small advertiser management updates.
June 28, 2022
The topic analyzer now uses a very basic machine learning model to determine the topic and keywords for a page.
June 20, 2022
Outside of dependency fixes, this release had two major features. Firstly, region and topic modeling are moved into the DB. Flights can target by region or topic. Secondly, we allow publishers to setup their own house ads.
June 3, 2022
The main change this release is turn on the daily analysis tasks. These will scan websites where we server ads to try to understand them and target better.
May 20, 2022
The largest changes in this release were to add helpful screens during onboarding of advertisers and publishers. Other than that, we are continuing to iterate on the offline keyword analysis.
May 4, 2022
There were a few small tweaks and bug fixes in this release. The big change was some new tasks to test offline keyword analysis which is not yet integrated in when deciding which ad to show.
April 20, 2022
Add a Front email backend, and a couple small dependency upgrades. This release also starts displaying the time an add is viewed (view time) to staff users. Once vetted, this will be shown to advertisers and publishers.
March 30, 2022
Fixed more issues that weren’t seen until staging. Notably, a New Relic upgrade was required.
March 17, 2022
This release fixed some issues not seen in development related to v0.48.0. That release shouldn’t be used.
March 17, 2022
This release was purely to update dependencies.
March 16, 2022
This version contained a number of small improvements to performance and some additional notifications. The larger change was a new staff-only (for now) form for renewing an advertising flight.
March 9, 2022
We had a bug in the previous release that affected server-to-server ad clients. These clients pass an IP address for geolocating and we weren’t re-running GeoIP for them properly.
February 21, 2022
The big change here is added middleware for getting IP addresses
and for geolocating them. This gives options instead of just relying on
X-Forwarded-For or using the MaxMind GeoIP databases.
For production, we will be using Cloudflare for GeoIP and IP normalization.
See the docs.
February 14, 2022
This is purely a bugfix release. The main fix is a fix for keyword aggregation that fixes a bug introduced in v0.44.0. All keyword aggregations done since v0.44.0 need to be re-run.
February 9, 2022
Other than a few quality of life improvements and bug fixes, the main change in this release is a many-to-many relation between Flights to Invoices.
February 8, 2022
NOTE: This release requires Python 3.8
The largest change in this release was an upgrade to Python 3.8. Other than that, there were a few migrations to support tighter Stripe integration and some changes that will allow a set of publishers who pay us (instead of get paid) to run their house ads or sponsorship.
January 26, 2022
The only changes in this release were minor bug fixes and slight tweaks on some checks when updating ads and flights.
January 20, 2022
The big change in this PR was the beginnings of tighter Stripe integration. This PR merely sets the groundwork by adding django-stripe which syncs data from Stripe to our local database.
January 18, 2022
This release adds the ability for advertisers to view old invoices, and does a few small operations changes. The most important is being able to rename the Offers database table, which we plan to do in production to improve database performance.
November 15, 2021
We added Plausible Analytics to see which parts of the dashboard get the most use. We also added a lot more charts for staff and made a couple charts available to advertisers and publishers.
October 28, 2021
The big change in this release was that we’re trying out some graphs. However, for this release, they are staff-only. Other than that, there was nothing user facing in this release.
October 21, 2021
Most of this release were small bug fixes and tweaks to staff notifications.
October 6, 2021
This release had a number of changes to support custom publishers and support for a read replica on our reporting.
September 24, 2021
This release had a minor change to topic-based reporting only.
September 13, 2021
The big change in this release was to revamp our reporting to be more focused on topic and region rather than individual keywords and countries/regions. This should make be much faster than the previous geo and keyword reports which will be phased out.
August 31, 2021
The main change in this release involved the server side changes to store how long an ad is viewed. We believe this is a cool metric to show to advertisers and may separate us from competition and generate higher revenues for publishers.
August 13, 2021
This release had no significant user-facing changes. All the changes involved staff interfaces, staff notifications, or documentation.
August 4, 2021
noopener to our ad links as a security precaution.
The other big change was to allow ad types to be publisher (group) specific.
We already have publisher specific ad types as Read the Docs
has a compatible but slightly different ad format from EthicalAds.
Some possible new publishers also expressed interest.
July 22, 2021
Mostly we added some new staff additions to help with payouts and help manage targeting. We also added some callouts to help refer publishers. Lastly, we did add a task to send Slack notifications to staff when publisher metrics change significantly week to week.
July 15, 2021
This release adds a new staff-only interface to manage publishers. It also adds the ability to notify via Slack when a campaign completes. Currently, these notifications are just for staff but in the future we could allow notifications for advertisers as well.
June 30, 2021
This release added change tracking to most models and minor payout workflow improvements.
June 17, 2021
This release improves payouts in the adserver, adds a RegionTopic index for improved reporting, and starts weighting CPC ads to publishers with higher CTR.
June 15, 2021
The biggest new changes here are a task to null out some old data periodically and a staff actions interface.
June 10, 2021
This release added some additional staff-only reports to understand advertising data. It also included a support form for advertisers and publishers to get in touch.
May 17, 2021
This release included advertiser dashboard improvements. Advertisers can invite other users at their company to work with them on advertising. We also added some minor filtering and reporting improvements. There is also a migration to ensure certain fields are unique.
May 5, 2021
The big change here is that the ad decision API now supports sending the URL where the ad will appear. In the future, we can use this for some additional targeting and automated fraud checking.
April 20, 2021
In our reporting interface, we added some more summary and high level data on ad and flight performance from a CTR perspective. The other big change was a tweak to ad prioritization to prioritize higher eCPM ads when making an ad decision.
April 15, 2021
The big change in this release was to add overview screens for advertisers and publishers.
Another change was to include a
ea-publisher query parameter with ad clicks.
This release also had some minor UX improvements to the reporting interface
and a few other minor changes.
April 1, 2021
This was a tweak to the stickiness feature that rolled out earlier today.
March 19, 2021
The main feature in this release was to make sticky ad decisions. This will make the same ad appear for the same user for a certain amount of time (default 15s) even if they load new pages.
March 19, 2021
This release fixes a bug in report sorting and adds a management command to archive offers
|date:||March 15, 2021|
- @ericholscher: Sort indexes based on raw data vs. display (#333)
- @davidfischer: Archive offers management command (#332)
- @dependabot[bot]: Bump elliptic from 6.5.3 to 6.5.4 (#331)
This release made some small reporting updates primarily for performance reasons.
March 8, 2021
This release is primarily bug fixes and minor changes to when scheduled tasks are run.
March 3, 2021
Most of these changes were minor quality of life improvements for managing the ad server. It did involve a small dependency bump so it is a minor version increase.
February 4, 2021
This change included just a new constraint to prevent a DB race condition. Depending on your database, you may need to remove some records to apply the constraint. See the migration file for a query to get the records that need to be removed.
January 19, 2021
We made a change to make it a little easier for advertisers to have compelling ads. Advertisers can now declare a headline for an ad, a body, and a call to action and our default styles bold the headline and CTA. These fields are broken out in our JSON API as well for ads if publishers do custom integrations. No changes were made to existing ads in our system.
December 17, 2020
The big user-facing change on this is to enable the publisher and geo reports for advertisers. There’s also an easy option to exclude a publisher for an advertiser if requested.
December 15, 2020
|date:||December 1, 2020|
This release contained some minor reporting changes and some admin-specific reports. We are testing some new advertiser reports (showing top geos, top publishers) but those are staff-only now but will likely roll out to all advertisers in the next release.
- @davidfischer: Advertiser reporting breakdowns (#295)
- @ericholscher: Add uplift reporting (#294)
- @ericholscher: Additional payout automation (#285)
|date:||November 24, 2020|
There were a few minor fixes and refactors in this release. We are defaulting new publishers to use viewport tracking (#292), and we found a slight bug which was hotfixed related to Acceptable Ads uplift. There were significant internal changes to reporting to make creating new reports easier but these should not have significant user-facing changes.
- @ericholscher: Update a few model method defaults (#292)
- @davidfischer: Report refactor (#291)
- @ericholscher: Don’t overwrite Offer on uplift (#290)
|date:||November 17, 2020|
This version adds additional reporting around keywords and offer rate. Both of these are behind admin-only flags until we do more testing, but will likely be enabled in the next release.
- @ericholscher: Add keyword reporting for publishers (#286)
- @ericholscher: Add Decision modeling to our indexes (#274)
|date:||November 10, 2020|
This version ships two new publisher reports: Geos and Advertisers. It also adds uplift tracking for Acceptable Ads tracking, allowing the server to be used for AA-approved ad networks.
- @ericholscher: Add uplift to Offers (#279)
- @ericholscher: Ship Geo & Advertiser reports to publishers (#278)
- @ericholscher: Don’t pass advertiser to the all publishers reports. (#277)
- @dependabot[bot]: Bump dot-prop from 4.2.0 to 4.2.1 (#276)
|date:||November 3, 2020|
None of the changes in this release are user facing. There are improvements to track and understand the fill rate for publishers (why some requests don’t result in a paid ad) and another change to prepare to show publishers details of the advertisers advertising on their site.
- @ericholscher: Make Offers nullable to track fill rate (#272)
- @ericholscher: Add a new report for Publishers showing their advertisers (#271)
- @ericholscher: Add ability to sort All Publishers report by all metrics (#273)
|date:||October 29, 2020|
This release adds the ability do to viewport tracking on publisher sites. It is managed on the backend via an admin setting, and we’ll be slowly rolling it out to publishers.
- @ericholscher: Add a render_pixel option to the publisher. (#269)
- @davidfischer: Performance workaround for the offer admin (#267)
|Date:||October 27, 2020|
This release adds Celery tasks for indexing of all our generated reporting indexes. We also added a Geo index in beta for this release, along with a few performance improvements.
- @davidfischer: Add an estimated count paginator (#265)
- @davidfischer: Add get_absolute_url methods to flight and advertiser models (#264)
- @ericholscher: Show breakdown report on the Geo/Placement reports by default (#263)
- @ericholscher: Remove unused entrypoint from dockerfile (#262)
- @ericholscher: Properly sort Countries in Geo report by most views (#261)
- @ericholscher: Migrate PlacementImpressions to a Celery task (#260)
- @ericholscher: Clean up Publisher settings (#259)
- @ericholscher: Cleanup celery config to work with beat (#258)
- @davidfischer: Index the date fields on ad impressions, clicks, views, and offers (#257)
- @ericholscher: Callout to EA (#256)
- @ericholscher: Add an initial Geo report for publishers (#244)
|Date:||October 1, 2020|
v0.10.2 finally fixed the slow migration issues.
- @ericholscher: Make ad_type a slug on the AdBase & PlacementImpression (#248)
|Date:||October 1, 2020|
v0.10.0 caused a very long migration which we resolved in v0.10.1
- @ericholscher: Don’t index ad_type on the AdBase (#246)
|Date:||October 1, 2020|
The major change in this release was to allow publishers to individually
track the performance of ads on certain pages/sections separately
by adding an
id attribute to the ad
Behind the scenes, there was a rework in how we track when an ad is
offered and viewed but those are not user facing.
- @ericholscher: Store placements and keywords and add reporting (#239)
September 22, 2020
|Date:||August 25, 2020|
The largest change in this release was to store publisher payout settings and allow publishers to connect via Stripe to attach a bank account for payouts.
- @davidfischer: Turn down the rate limiting logging (#232)
- @davidfischer: Use Django2 style URLs everywhere (#231)
- @davidfischer: Refactor publisher tests (#230)
- @davidfischer: Store publisher payout settings (#229)
- @davidfischer: Refactor flight metadata view (#180)
- @davidfischer: Store publisher payout settings (#177)
|Date:||August 18, 2020|
The two changes in this release were to add branding to the ad server which is only enabled in production and shouldn’t be used by third-parties and to add the ability to group publishers into groups for targeting purposes.
- @davidfischer: Group publishers (#227)
- @davidfischer: Add EthicalAds branding to the adserver (#226)
|Date:||August 5, 2020|
The main change in this version is to add a database model for storing publisher payouts and making that data visible to publishers.
- @davidfischer: Change some log levels around impressions blocking (#224)
- @davidfischer: Save publisher payouts (#223)
- @ericholscher: Make Publisher defaults line up with Ad Network defaults (#222)
|Date:||August 3, 2020|
This release had a few minor changes but the larger changes involved adding the ability to rate limit ad views and an admin action for processing advertiser refunds/credits.
- @davidfischer: Admin action for processing refunds (#220)
- @davidfischer: Default ad creation to live (#218)
- @davidfischer: Ignore all known users (#217)
- @davidfischer: Update the all publishers report to show our revenue (#216)
- @davidfischer: Rate limit ad viewing (#212)
July 29, 2020
July 29, 2020
|Date:||July 28, 2020|
This was purely a bugfix release.
- @davidfischer: Fix a bug around clicking an add after 4 hours (#208)
|Date:||July 28, 2020|
There’s two main changes in this release related to blocking referrers and UAs:
Firstly, the setting
Also, we added a setting
- @davidfischer: Send warnings to Sentry (#206)
- @davidfischer: Allow blocking referrers for ad impressions with a setting (#205)
|Date:||July 28, 2020|
This is a minor release that just changes some cookie settings to have shorter CSRF cookies and send them in fewer contexts. It also allows the link for an advertiser’s ad to contain variables.
- @davidfischer: Allow simple variables in Advertisement.link (#201)
- @davidfischer: CSRF Cookie tweaks (#196)
|Date:||July 23, 2020|
This is mostly a bugfix release and contains some slight operations tweaks. The biggest change is to allow mobile targeting or excluding mobile traffic.
- @davidfischer: Fix a secondary check on geo-targeting (#199)
- @davidfischer: Optimization to choose a flight with live ads (#198)
- @davidfischer: Remove request logging (#193)
- @davidfischer: Allow targeting mobile or non-mobile traffic (#192)
- @dependabot[bot]: Bump lodash from 4.17.15 to 4.17.19 (#190)
- @davidfischer: Flight targeting to include/exclude mobile traffic (#188)
|Date:||July 15, 2020|
The major change in this version is the Stripe integration which allows tying advertisers to a Stripe customer ID and the automated creation of invoices (they’re created as drafts for now) through the admin interface.
- @ericholscher: Order the Ad admin by created date, not slug (#187)
- @davidfischer: Use Django dev for Intersphinx (#186)
- @davidfischer: Stripe integration (#185)
- @ericholscher: Update docs to explain auth on POST request (#184)