MVP, landing and advertising for 1500 rubles

Probably, many had to make specific tools for their narrowly tailored needs - scripts or Excel tables. And after thinking: what if someone else needs the exact same solution? How to find out about this and understand whether it is possible to make money on it?

My story began with a fairly simple task. I needed to calculate only one number: the annual yield for my investment instruments. Having searched the entire Internet and not finding a ready-made solution, I had to make it based on Google tables myself. It turned out well - and I decided to check if there is a commercial demand for my development.

In this article I will tell:

  1. how to make a table to calculate the annual return on investment, taking into account all operations and periods;
  2. How to create a landing page and configure analytics for potential users;
  3. how to test the hypothesis and potential demand using contextual advertising in Yandex with a budget of 1,500 rubles.

I. Calculation of Annual Returns: Tool Development


Immediately the following formula comes to mind
[profit] / [invested funds] / [number of days] * 365 = [profitability in% / per annum]
She really works when she invested money and after a while took off more.

What should I do if I deposit money in several installments at different times or when payments occur periodically? In this situation, it is difficult to understand how much and how much time was on the account. Naturally, I am not the first to encounter such a problem and at the moment there are two solutions:

  1. . , . : , .
  2. IRR . , . ?

If you add up all the cash flows (subtract investments and add withdrawals), then the resulting difference is income. For example, they invested 10,000 rubles in a bank, a year later they removed 10,600 rubles, while the income was 600 rubles. You can also get income by multiplying the investment amount by the interest rate. For example, we multiply 10,000 rubles by a bank rate of 6%, we get 600 rubles.

More interesting, we change cash flows by a number that would compensate for the profit. Here is a more competent description , but in essence the whole logic lies in the following formula:

IRR is the unknown annual return. We substitute the values ​​from the example with a bank deposit: - 10,000 rubles / (1 + 6%) ^ 0 + 10,600 rubles / (1 + 6%) ^ 1 = 0. Everything converges. Now it remains to express the IRR and calculate it already programmatically with the help of loops or the function PURE in Excel.

MVP in Google Sheets


To calculate the IRR, it is enough to know the amounts of operations and the dates when they were completed. Compiled several columns in the tables.



I wrote down the names of the instruments, all operations on them (with plus - investment, with minus - withdrawal), dates of operations and the value of assets (how much is now in the account). Not seeing an elegant solution using formulas, I proceeded to writing a script. Google documents use cropped javascript so there are no problems with learning. Go to Tools -> Script Editor. We are writing our code.

We get the data from the table
var ss          = SpreadsheetApp.getActiveSpreadsheet(); //  
var sheet       = ss.getSheetByName("");         //   ""
var instruments = sheet.getRange("E4:F").getValues();    //          $
var operations  = sheet.getRange("A4:C").getValues();    // C      $   


We sort through all the operations
  
  ////////////    
  //    
  var dohNaProc = 0;
  //  
  var allDohod = 0;
  
  //   
  insts.forEach(function (inst,i){
    
    //    
    var summs = [];
    //     
    var dates = [];
    //    $
    var dohod = inst[1]; 
    
    //   
    ops.forEach(function(op,n){
      //     
      if(inst[0] == op[0]){ 
        //    
        summs.push(-1*op[2]);
        //  
        dates.push(op[1]);
        //  
        dohod -= op[2];
      }
      
    })    
    
    //  ,    
    summs.push(inst[1])
    //     0 ( ),    ,    
    //    - ,     
    dates.push( (inst[1] == 0) ? dates[dates.length-1] : new Date() )
    
    
    //        1   
    const dohodProc = (XIRR(summs,dates)*100).toFixed(1)
    
    //     
    dohNaProc += (dohodProc != 0) ? dohod/dohodProc : 0
    //   
    allDohod  += dohod
    
    //        2   
    dohod = dohod.toFixed(2)

    Logger.log(dohNaProc+" "+allDohod)
    //   
    var strN = 4+i
    //      %
    var func = '=ROUND((((SUMIFS(C$'+strN+':C;A$'+strN+':A;E'+strN+';C$'+strN+':C;"<0")*(-1)+F'+strN+')/SUMIFS(C$'+strN+':C;A$'+strN+':A;E'+strN+';C$'+strN+':C;">0"))-1)*100;1)';
   
    //   
    sheet.getRange("G"+strN+":I"+strN).setValues([ 
      [dohodProc.replace(".",","), dohod.replace(".",","),func]
    ]);

  })// end foreach insts
  

  //   
  const allDohodProc = (allDohod/dohNaProc).toFixed(1)
  //  
  sheet.getRange("G3").setValues([[". . "+allDohodProc+" % / "]]);



Send to IRR calculation function
function XIRR(values, dates, guess) {
  // Credits: algorithm inspired by Apache OpenOffice
  
  // Calculates the resulting amount
  var irrResult = function(values, dates, rate) {
    var r = rate + 1;
    var result = values[0];
    for (var i = 1; i < values.length; i++) {
      // result += values[i] / Math.pow(r, moment(dates[i]).diff(moment(dates[0]), 'days') / 365);
      result += values[i] / Math.pow(r, daysLag(dates[i],dates[0]) / 365);
    }
    return result;
  }

  // Calculates the first derivation
  var irrResultDeriv = function(values, dates, rate) {
    var r = rate + 1;
    var result = 0;
    for (var i = 1; i < values.length; i++) {
      // var frac = moment(dates[i]).diff(moment(dates[0]), 'days') / 365;
      var frac = daysLag(dates[i], dates[0]) / 365;
      result -= frac * values[i] / Math.pow(r, frac + 1);
    }
    return result;
  }

  // Check that values contains at least one positive value and one negative value
  var positive = false;
  var negative = false;
  for (var i = 0; i < values.length; i++) {
    if (values[i] > 0) positive = true;
    if (values[i] < 0) negative = true;
  }
  
  // Return error if values does not contain at least one positive value and one negative value
  if (!positive || !negative) return '#NUM!';

  // Initialize guess and resultRate
  var guess = (typeof guess === 'undefined') ? 0.1 : guess;
  var resultRate = guess;
  
  // Set maximum epsilon for end of iteration
  var epsMax = 1e-10;
  
  // Set maximum number of iterations
  var iterMax = 50;

  // Implement Newton's method
  var newRate, epsRate, resultValue;
  var iteration = 0;
  var contLoop = true;
  do {
    resultValue = irrResult(values, dates, resultRate);
    newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);
    epsRate = Math.abs(newRate - resultRate);
    resultRate = newRate;
    contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);
  } while(contLoop && (++iteration < iterMax));

  if(contLoop) return '#NUM!';

  // Return internal rate of return
  return resultRate;
}


We count the number of days between dates
///     ////
function daysLag(d1, d2){
 //     js
 var date1 = new Date(d1);
 var date2 = new Date(d2);
 //  
 return( Math.ceil(Math.abs(date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)) ); 
}


Go to the table, run the script. The annual yield, taking into account all operations and periods is calculated!



Added all sorts of additional formulas and graphs. Now for sure the beauty.



In order not to update the file manually each time, in Sheets you can configure the script to run on an event: opening a table, clicking, changing. To do this, from the script editor, go to Edit -> Triggers of the current project. We set the following values ​​there.



Now the calculations are updated automatically. The table is ready. There is something to modify, but it will do for me.

II. Calculation of Annual Returns: Demand Analysis


Before understanding the formulas and writing code to calculate just one value, I searched the entire Internet and did not find a ready-made solution. So, apparently, there is no demand. But now that the table is ready, “and he saw that it turned out well,” it became interesting to check - is there any potential demand for such a solution?

I don’t have a lot of familiar investors for conducting a problematic interview, so we turn to affordable and quick verification methods.



Yandex statistics show some interest in this area, but the market size is not enough to make it cost-effective to design and develop a separate service.

On the other hand, my survey on vc.ru showed that 46% use tables for accounting.



Perhaps, due to the small sample, the results are within the margin of error.

Nevertheless, there are clearly people who did not find the finished service and compiled a tablet. What if it’s the most convenient option for them or the difficulties are so insignificant that you don’t even want to open the Google Play or the App Store?

To verify this assumption, I created a survey in Google forms with the ability to leave mail for a raw version of the program.



To fill in at least some traffic, I wrote an article on vc. Result: 1095 views, 1 person left a request. The 0.1% conversion does not prove low demand, since it also depends on many factors: the clarity of the article, the interests of the audience, the location of the target action, etc. The received application suggests that the person was not too lazy to give mail to solve accounting problems.

To learn more about the problem and the shortcomings of existing solutions - you need people. Traffic from a free post is temporary and not targeted enough. I decided to give contextual advertising for key queries.

You cannot send people to the table right away - they won’t understand what is happening. Accordingly, you need a landing page, and the simpler the better.

Landing


Open the designer, Wix or Tilda, select a template, change the text and links, publish, pay. Affairs for 20 minutes.



It's simple, but with the last paragraph there were difficulties. After his dismissal, he rested a little longer than planned, he did not want to unpack deposits. For some time I had to live on unevenly coming small dividends. At that moment there was not even 700 rubles to pay for the full version. You can’t connect analytics, a domain, or work on SEO in a free one.

I had to do better. Found not very scary free bootstrap-template. I downloaded, deleted the extra blocks, replaced the text and pictures.



Analytics


The main task is to learn as much as possible about problems, solutions, people. To collect data, I will use Yandex metrics, Google Analytics, Google Tag Manager, link shortener.

Why two web analytics? Firstly, to check and understand in time if analytics is not working properly. Secondly, it is possible that in the future I will give advertising not only in Yandex, but also in Google, and for an effective advertising campaign we need data on user behavior. Moreover, now there is an opportunity to simply tell Yandex: bring me people who will buy this product, and the neural network will do the rest. So it's time for marketers to think about a new profession.

Why GTM? Google Tag Manager is a modern way to connect analytics, which provides the following benefits:



  • .
    .

  • , ,
    . , ,
    , .

  • GTM ,
    .

  • , ,
    , .

  • Tag Manager
    , , -.


  • .

We create a new counter and copy the HTML code in the Yandex metric.



We go to Google Tag Manager, create an account and a container.



After which the service will show a code to connect to the site. Click Create Tag. A tag is a setting of what should be started (tag configuration) and at what event (trigger).



In the tag configuration, select "custom HTML", insert the metric code there, and as a trigger - "view all pages". Now, when viewing any page, the user will start the Yandex metric.

In this example, the benefit is not very great, it would be easier to insert a counter directly, but setting up events through GTM is much more useful.

We return to the metric. Settings -> Goals -> Add Goal. We come up with a name and identifier, they should be brief and describe the purpose.



I checked the box next to Retargeting, so that the advertising campaign can focus on this goal when it attracts people. Copy the code below, save and go to GTM. Create a new tag, as before, paste the copied code. Create a new trigger, this time with the Click type.



Here in my case we select “some clicks” and set that the trigger will be activated when clicking on an element with an ID equal to btn_sheet. To find the item ID - go to the site through Chrome, press Ctrl + Shift + C and click on the item.



Save the trigger, click "Preview" and go to the site.



A console will appear on the site for verification. Above are the events that have been completed, below are all the others. We click on the button and the corresponding event should move up. If so, then you can move on.

Google analytics


We are registered in Analytics, we create an account and a resource.



It will be much easier here, since GTM has integration with Analytics. To connect, just select the appropriate tag.



To add events, you do not need to copy and paste the HTML code, they can also be configured in the corresponding tag. After creating all the triggers, you can publish the version, click "Submit". Now Analytics and Metric are configured.

Link shortener


I plan to build the following funnel: advertising -> site -> table -> form for recording for testing. From advertising to the table, information about the user will go to Metrica, but his further steps remain a mystery.

To calculate the transitions, I decided to use a link shortener. There are a lot of such sites. After going through five pieces, I chose the most optimal one - to.click . He can:

  • Change short link name after creation
  • Shows countries and devices of users
  • Add your own domain (paid version)
  • Add a pixel for more tracking (paid version)

Registered, created links to track the following transitions:

  • From advertising in Yandex to a table
  • From advertising in Yandex to testing the web version
  • From Yandex Advertising to Testing iOS Applications
  • From advertising in Yandex to test Android applications
  • From site to table
  • From site to testing
  • From table to testing

Hosting and domain


Registered hosting in Timeweb for 179 rubles. It is large, functional and cheap. There he took a domain in the .ru zone for the same 179 rubles + a free SSL certificate (shows that the site can be trusted). The domain name is neutral, so that in the future you can create as many subdomains as you like for free (for example poddomen.neitralnoe-nazvanie.ru) and check other projects for them. It is convenient to register everything in one place, then you do not need to bind the domain and server, connect the certificate, everything happens automatically. I upload all the site files to the server through the Timeweb file manager - the site is ready.

I won’t tell you how to deceive services - I’ll just say that I received another bonus of 200 rubles according to the referral program, and my friend also received 200 rubles. Total spending went to (179 + 179-200) 158 rubles (if my friend were me, I would even be in the black for 42 rubles).

Advertising


The site is ready, now only people are needed. There are many advertising strategies, in my situation I needed an approach with a minimal budget, which meant that I could only attract a small number of people. Accordingly, these users need to be as targeted as possible. That is, only those who need exactly my product.

I also need maximum conversions. That is, so that as many people as possible go to each next stage from the previous one. There are three such steps now: advertising -> site -> table -> record for testing. I decided to achieve high conversion using simplicity, convenience, relevance, continuous improvement through experimentation and user research.

The choice fell on contextual advertising with low-frequency queries. That is, the display of advertising in the search results for small search queries - they lower competition and cost per click.

Keyword Selection


First you need to pick up as many words as possible that are associated with the area of ​​my product. I have two columns: action and base word. There are not many requests in this area, but in another there may be more, for example, address, color, characteristics, etc.



We throw the keywords received in the combinator (there are a lot of them, all are the same in terms of functionality).



The service matches each word with each of all the columns, it turns out a bunch of phrases. After downloading SlovoEb - this is the real name of the free and very useful marketing program. Go to Settings -> Parsing -> Yandex.Direct. We add the created new Yandex account (not personal, it can be blocked).



Save further, go to Data -> Add Phrases. Paste the list obtained in the phrase combinator. After we go to the Data Collection section.



I have fairly short phrases (out of 2 words) - perhaps there are longer phrases, and, therefore, rare ones (low-frequency ones). Therefore, I click on Batch collection from the left column. The program will find all queries containing the contents of these phrases that Yandex searched earlier. After completing the parsing, take key phrases with a frequency column and throw in Excel.

Yandex Direct


Let's set up Yandex.Direct: click Add -> Campaign -> Text and image ads.



Schedule of impressions, I leave the region as it is. My product can be used anytime, anywhere. I connect the Yandex metric counter, I assign a strategy: show only manual search and bid management. This means that Yandex will always try to show my ad, regardless of the competitors' click price. I guess that with such low-frequency phrases it will be small.



In bid adjustments, I reduce the bid for smartphones to a minimum. It will be more difficult for the user to figure out the table on the smartphone, which means that they will have a bad conversion.

I bring in negative phrases based on requests that I received earlier. Someone is looking for specific methods, course authors, or things from a completely different field. For example, the query “comparing asset 1 and asset 2” turned out to be not about finances, but about watch models. Plus on the Internet there are universal lists of negative phrases. In my case, this is a course, diploma, task, etc. At this stage, you cannot cut off all irrelevant requests, so you will need to constantly monitor analytics and new phrases.

In the advanced settings I leave the advanced geographical targeting, add my chat with an operator based on Yandex. Now it’s important for me to communicate with users as much as possible. Go to Yandex-Dialogs, Create chat -> Chat for business.



It is important to add an icon the same as on the site. I create a picture of 2 sizes. favicon.png 64x64 px for the site you need to drop it into the folder with the site. And the same 224x224 for dialogs.



After saving on the Widget tab, you need to copy the code and add it to your site so that the dialogue with the operator can be opened not only in the search engine, but also on the site. Then, on the General tab, copy the dialogue identifier and paste it into the Yandex.Direct advertising company.



I also include the item “stop ads when the site is down”, and save the advertising campaign.

We will carry out further editing in the Excel table, therefore, in the interface we create a group and an announcement for example only. Add -> Group. Here you need to write any line in the key phrases. After saving, Direct will offer to create an ad.

We hammer in any heading, primary and secondary. The text of the announcement can be written immediately some universal. Image and video are not added until there is no time to steam with creatives. Only text ads will be shown, it’s also more conversion.

I have no contact information and a virtual business card. You can add more information to the transition page. For example site.ru/#invest-programa. Although it does not lead to a separate page, it increases the size of the ad, making it more visible. If each request has a link with the corresponding name, then it will be more relevant for the user.

Add refinements and quick links. This is where tracked links previously created in the shortener will be needed. I create the following:

  • Excel spreadsheet
  • Web application
  • iOS app
  • Android app

Three of them lead to the same form of recording for testing, so this is an opportunity to find out at the same time which application format users want. Add a description to the links - again, to increase the size of the ad. Save.

Adding Ads Through Excel


For more precise settings, it’s worth creating an ad for each keyword phrase. I have more than 100 of them. And it’s better to even create 2 additional phrases, 2 texts and, by combining, get 4 ads for each key phrase. Already, the algorithm empirically identifies the most conversion ones. Such a quantity is unrealistic to do in the interface, so go to Tools -> Manage with Excel. Download the table.



It looks scary, but since we pre-filled one group and an ad, you can figure it out. We delete the group ID, phrases, ads, then when uploading to Yandex.Direct, new ads will be created, and not updated.

We return to the key phrases that we collected earlier. Here you just need to sweat. We delete everything that does not fit the context.



We return to unloading. The ad line needs to be copied as many times as there are key phrases left. Next, insert the column of key phrases in 3 places: group name, phrase, title. Yes, the user’s request will be completely duplicated in the header of the ad, so the maximum conversion is obtained. If it exceeds 35 characters, you need to trim. That's all, the following picture has turned out. As I said, if you wish, you can create several combinations of ads.



Save and load back to Direct. It was supposed to be a lot of groups, each with one key phrase and one ad. In principle, it would be possible to create several groups, each with several key phrases common in meaning and the same number of ads with the corresponding heading, but Yandex does not always choose the ad correctly. I don’t know what this is connected with.

You can pay and run the campaign. For such low-frequency advertising, if everything is done correctly, at first you can keep within 10,000 rubles. I threw 1500.

results


Since there are few users with such a budget, I got the opportunity to track practically each one individually.

Using Metrica, I looked at what query he entered, from which he learned new areas of problems and added negative phrases to ads. Through Webvisor, I followed all the actions on the site. I studied link navigation paths and errors from Google Apps logs.

Let's move on to the numbers.





Conversions are really good, but, I repeat, I focused on a small number of super-targeted users. If you increase coverage, you will need to change the strategy, raise the budget and tolerate a decrease in conversion.

Also, from such a small amount does not derive any statistics. This is not to say that 20% of MVP users sign up for testing, if we are talking about only two out of ten users, they could well fall within the margin of error.

Apparently, 342 rubles were spent during the month. at a click cost of 1.54 rubles. This is only 20% of the budgeted budget, so maybe later I will launch another campaign with an increase in the audience and add more useful information to the landing page - but at the moment everything is working just as intended.

All Articles