Dạo qua phần 1 và phần 2, ta sẽ thấy cho dù tuân thủ tuyệt đối policy, preload chuẩn chỉnh, thì đôi khi show rate vẫn không đẹp, lòng ta vẫn sẽ đầy thắc mắc tại sao lại thế, rồi làm sao để tối ưu doanh thu, giữ chân người dùng. Ta cùng tham khảo một phương pháp mà theo kinh nghiệm bản thân mình là khá ổn, cũng nhận thấy nhiều game/app lớn sử dụng phương pháp tương tự.
Ở đây ta chỉ bàn về các yếu tố trong tầm kiểm soát, không bàn đến các yếu tố do ad networks kiểm soát. Vậy ta kiểm soát được những gì? Đó là vị trí đặt quảng cáo, và tần suất hiện quảng cáo.
Vậy, câu hỏi thứ nhất là làm sao để chọn các vị trí đặt quảng cáo “dễ” có CTR cao nhất (tất nhiên phải tuân thủ policy), và có nhiều chỗ để hiển thị quảng cáo nhất.
Tần suất hiện quảng cáo thì ai cũng nghĩ càng cao càng tốt, càng hiển thị được nhiều. Nhưng có một thực tế là hiển thị quá nhiều quảng cáo cho cùng một user, trong cùng một phiên chơi sẽ làm tụt eCpm; đồng thời quá nhiều quảng cáo cũng làm user khó chịu (bad experience), dễ quit app, bỏ game, xóa game sớm. Vậy câu hỏi thứ 2 sẽ là làm sao để hiển thị được tối đa quảng cáo mà vẫn duy trì eCpm cũng như các thông số user experience (retention, daily engagement).
Bản thân AdMob đã tích hợp sẵn tính năng Frequency Capping trên giao diện của AdMob. Bạn không cần phải thay đổi gì trong code cũng có thể đặt được tính năng capping này. Nguyên lý khá đơn giản, bạn có thể đặt một con số giới hạn X impression trong Y phút (hoặc giờ/ngày). AdMob sẽ tự động dừng trả về quảng cáo khi đạt con số này
Tuy nhiên, cách này theo bản thân mình thì tuy có ưu điểm dễ dàng, thuận tiện, phù hợp với các bạn muốn đơn giản nhưng cũng có các hạn chế sau:
Với Firebase A/B testing, bạn có một công cụ tuyệt hảo để có thể thử nghiệm các vị trí đặt quảng cáo, các tần suất hiện quảng cáo khác nhau để tìm ra bộ giá trị thích hợp nhất cho ứng dụng của mình.
Ta xét trước một cách dùng đơn giản nhất của Interstitial, đó là chỉ hiển thi quảng cáo tại một ví trí: khi GameOver. Nếu đơn giản vậy có gì mà phải suy nghĩ nhỉ? Cứ GameOver thì hiện thôi? 30s chết, hiện. 5s chết, cũng hiện. Thậm chí 2s chết cũng hiện luôn. Như vậy liệu có thật sự ổn?
Theo mình thì không hề ổn. Kể cả các game casual, siêu quảng cáo như của Voodoo, họ cũng không hiển thị quảng cáo tất cả các lần GameOver, mà có một giới hạn.
Vậy cần đặt một giới hạn cho việc hiển thị. Đặt giới hạn có nhiều cách, như là 3 lần game over thì hiện 1 lần. Tuy nhiên cách này có thể có hạn chế, là tùy vào “khả năng” của users, mà thời gian họ game over rất khác nhau. Users kém có thể chỉ 10s, 20s. Users khá có thể chơi tận 1p, 2p, hoặc 5p lận. Hiển thị cách này “cào bằng” số lần chơi của users, làm cho thời gian hiển thị ads quá khác nhau, có thể là quá ngắn, hoặc quá dài. Ngắn quá thì không tốt dễ mất users, mà dài quá cũng không hay, thiệt hại doanh thu.
Một cách khá ổn đó là dùng 1 khoảng ngắt quãng (interval) giữa 2 lần quảng cáo. Mình đánh giá cách này tốt nhất. Từ góc nhìn của users, với một khoảng thời gian đủ lớn khi chơi game, họ có thể “quên” là vừa nhìn thấy 1 impression rồi, và dễ chấp nhận impression tiếp theo. Quãng thời gian này tùy thuộc rất nhiều vào dòng game, tập users. Đây sẽ chính là giá trị chúng ta có thể kiểm soát trong code và A/B test được nó.
Đây là các bước để kiểm soát interstitial frequency bằng 1 quãng ngắt (interval) và A/B test để tìm ra giá trị tốt nhất này:
Cách setup cơ bản của RemoteConfig và A/B testing bạn có thể tham khảo lại tại đây. Ta sẽ tạo 1 key là interstitial_interval với giá trị mặc định là 120 (ứng với 120 giây – 2 phút). Tất nhiên, giá trị mặc định này là tùy bạn quyết định.
Cách thực hiện khá đơn giản. Mỗi lần “cần” hiển thị interstitial, thay vì gọi trực tiếp hàm show, ta sẽ thực hiện check thời gian trước. Ta lưu lại thời gian từ lần gần nhất hiển thị interstitial (sẽ khởi tạo giá trị âm rất lớn cho biến này để lần đầu hiển thị không bị giới hạn). Dựa vào đó để kiểm tra nếu quãng thời gian từ lần gần nhất show interstitial đã vượt qua thời gian giới hạn thì ta hiển thị quảng cáo và cập nhật lại giá trị. Còn nếu không thì bỏ qua, không show Interstitial.
Chú ý: nếu bạn sử dụng phương pháp Singleton giống bài viết của mình, hoặc bạn cũng có callback để thực hiện sau khi hiển thị-đóng interstitial thì cần nhớ thực hiện callback đó nếu quảng cáo không được hiển thị do chưa đủ thời gian.
Mục đích của việc A/B là để tìm ra giá trị interval tốt nhất, có thể tối đa doanh thu qua cân bằng giữa 2 việc: số lượng quảng cáo/click (doanh thu tức thời) và users experience (giữa chân users, từ đó duy trì doanh thu lâu dài). Như vậy ta cần để ý đến các metrics kết quả là:
Giá trị mặc định cho interval ở trên là 2 phút. Giả sử ta muốn A/B test, xem giữa các giá trị 1 phút – 2 phút – 3 phút, giá trị nào là tốt nhất. Vậy ta chia đều users ngẫu nhiên thành 3 tập và nhận lần lượt các giá trị này:
Chú ý: với sức mạnh của Firebase A/B test, bạn có thể custom (tùy chỉnh) việc test cực kỳ chi tiết. Một số ví dụ:
Thả cho test chạy ít nhất 1 tuần (khuyến khích 2 tuần cho chắc chắn), Firebase sẽ báo về một bảng kết quả tương tự như sau:
Cần chú ý rằng, Firebase đánh giá nhóm thắng/thua/tốt nhất (leader) dựa vào duy nhất metric chủ đạo mà bạn lựa chọn (trong hình là mình chọn Daily Engagement), chứ không tự cân bằng toàn bộ các thông số. Do đó, thực tế là: có thể UX metrics sẽ tăng, nhưng revenue (ngắn hạn) sẽ giảm hoặc ngược lại. Bạn sẽ phải là người tự cân bằng và chọn ra phương án tốt nhất.
Lấy ví dụ, retention tụt 5% D1, 2%D2-D3 và 1% D7; nhưng bạn có nhiều hơn 10% ad_impression và ad_click. Vậy nên chọn gì đây?
Bạn có thể thực hiện test nhiều lần, thay đổi từ từ. Lần một test 1p, 2p, 3p. Nếu 1p tốt nhất thì có thể thử thêm 45s, 1p, 1p15s xem có khác biệt không. Kiên trì và thử sai là cách duy nhất để tìm ra phương án tối ưu. Rất may là chúng ta có Firebase giúp quá trình thử sai này nhanh và ít đau đớn hơn.
Thực sự thì tham khảo từ các dòng game nặng về quảng cáo, cũng như từ kinh nghiệm bản thân, mình thấy gần như không nên hạn chế vị trí quảng cáo. Có ý kiến cho rằng dù là GameOver (kết thúc ván) nhưng cũng chỉ nên show quảng cáo khi users thắng, không show khi users thua. Hoặc không nên show khi mới vào game, khi users thoát etc… Tuy nhiên, phải nói là tùy dòng game, cũng như tập users mà mọi thứ sẽ khác.
Mình cảm thấy không quá cần thiết khi phải hạn chế vị trí quảng cáo. Do thường nó có thể làm ảnh hưởng khá nặng đến lượng impression (show rate, revenue), mà không thay đổi quá nhiều users experience (retention, daily engagement). Tuy nhiên, nếu có đủ nguồn lực, cũng như traffic rất lớn, thì việc tối ưu vài % là vẫn nên làm.
Ta xem xét thử một ví dụ A/B test 2 vị trí đặt quảng cáo: GameOver (kết thúc ván) và GameStart (trước khi bắt đầu ván chơi). Để xem xét hiệu quả doanh thu của các vị trí đặt khác nhau, ta nên tạo các ad unit khác nhau cho từng vị trí. Vậy các bước thực hiện việc A/B test trong trường hợp này sẽ là:
Ta tạo 2 ad units cho 2 vị trí đặt quảng cáo:
Tạo tiếp 2 cặp giá trị trên RemoteConfig để điều chỉnh việc hiển thị quảng cáo:
Tiếp theo trong code của mình ta check 2 biến này, để kiểm tra có cần hiển thị quảng cáo tại mỗi placement hay không:
Cuối cùng là tương tự phần 2, ta sẽ tạo nhóm users thành các group khác nhau để test: hiện quảng cáo chỉ khi game over, hiện quảng cáo chỉ khi game start, hay là hiện quảng cáo ở cả 2 vị trí:
Ghi nhớ là duy trì việc test trong ít nhất 1 tuần (nên là 2 tuần) để có kết quả chính xác.
A/B test là một công cụ mạnh, và việc tích hợp A/B test để tối ưu hết cỡ hiệu năng quảng cáo trong ứng dụng là điều “phải” làm. Một số kinh nghiệm/chú ý khi thực hiện việc A/B test của mình:
Không chỉ tối ưu performance của ứng dụng qua việc thay đổi UI, cập nhật tính năng etc… việc tối ưu performance monetization (hiệu năng kiếm tiền quảng cáo) cũng là cực kỳ cần thiết. Again, monetization là một nghệ thuật, và người làm monetizing là nghệ sĩ.
Chia sẻ để cùng trở thành nghệ sĩ nhé ^^
1. App Open Ads là định dạng như thế nào Quảng cáo khi mở ứng…
Part II. Basic Ad formats Depending on type of apps, you will have different ad…
According to the definition of Google Ads support: Mobile ads are concepts to show ads…
Banner thì có gì mà nói? Cái định dạng cổ xưa, siêu cũ kỹ, ai…
II. Kỹ thuật preload interstitial và các vấn đề liên quan 1. Preload Interstitial ở…
Trong series AdMob Interstitial này mình sẽ tóm tắt các kiến thức về AdMob policy…
View Comments
Cho mình hỏi khi chạy Firebase A/B test thì mình chạy với Ads Production luôn hay chạy với Ads test ? Nếu chạy vơi Ads production thì có bị đánh dấu là Invalid Traffic ko ?
Cảm ơn.
Mình ko hiểu ý câu hỏi bạn lắm. Việc chạy A/B test hoàn toàn độc lập với các vấn đề về invalid traffic, policy... Việc có bị ảnh hưởng ko là do cách bạn thiết lập test.
Ví dụ A/B test giữa 2 nhóm cho tần suất hiển thị quảng cáo thì (thường) ko ảnh hưởng gì.
Tuy nhiên nếu bạn A/B test thêm nhiều vị trí đặt quảng cáo, mà các vị trí mới sai policy thì cả app vẫn chịu ảnh hưởng.
Nhưng tựu chung, việc A/B test ko phải nguyên nhân cho các trường hợp đó, mà cách bạn cái đặt từng nhóm test phải đảm bảo ko sai phạm
Hi admin,
Rất cảm ơn seri về admob của bạn, trước đó mình bị khóa account vì vi phạm policy, sau khi đọc seri của bạn mình đã rõ lý do sao mình bị block và mình đã tránh hết các policy với account mới, nhưng hiện tại vẫn bị google thông báo "Ad serving has been limited" mình khá lo lắng, ko biết liệu có lại bị Disable Account nữa ko.
Bạn có thể làm các seri nói về lỗi "Ad serving has been limited" và bị "Disable Account" trên account và các lỗi thường bị ko?
Cảm ơn.
699206 934163Perfectly written topic material , thanks for selective details . 561468
696709 22840Last month, when i visited your weblog i got an error on the mysql server of yours. ~, 586714
592599 327822Music began playing anytime I opened this web site, so irritating! 511474
399030 282961This constantly amazes me exactly how blog owners for example yourself can locate the time and also the commitment to maintain on composing great blog posts. Your web site isexcellent and 1 of my own ought to read blogs. I basically want to thank you. 984702
676287 60237Thanks for your time so a lot for your impressive and remarkable guide. I will not be reluctant to endorse your internet websites to any individual who should receive direction on this problem. 35758
142987 313223Sweet internet site, super pattern , real clean and utilize genial . 185729
764279 615490Excellent post, thanks so a lot for sharing. Do you happen to have an RSS feed I can subscribe to? 498730
928636 389422Youre so cool! I dont suppose Ive read anything like this before. So nice to search out any individual with some original thoughts on this topic. realy thank you for starting this up. this internet site is one thing thats wanted on the internet, somebody with a bit of originality. helpful job for bringing something new towards the internet! 677555