Alpha Software Mobile Development Tools:   Alpha Anywhere    |   Alpha TransForm subscribe to our YouTube Channel  Follow Us on LinkedIn  Follow Us on Twitter  Follow Us on Facebook

Announcement

Collapse

The Alpha Software Forum Participation Guidelines

The Alpha Software Forum is a free forum created for Alpha Software Developer Community to ask for help, exchange ideas, and share solutions. Alpha Software strives to create an environment where all members of the community can feel safe to participate. In order to ensure the Alpha Software Forum is a place where all feel welcome, forum participants are expected to behave as follows:
  • Be professional in your conduct
  • Be kind to others
  • Be constructive when giving feedback
  • Be open to new ideas and suggestions
  • Stay on topic


Be sure all comments and threads you post are respectful. Posts that contain any of the following content will be considered a violation of your agreement as a member of the Alpha Software Forum Community and will be moderated:
  • Spam.
  • Vulgar language.
  • Quotes from private conversations without permission, including pricing and other sales related discussions.
  • Personal attacks, insults, or subtle put-downs.
  • Harassment, bullying, threatening, mocking, shaming, or deriding anyone.
  • Sexist, racist, homophobic, transphobic, ableist, or otherwise discriminatory jokes and language.
  • Sexually explicit or violent material, links, or language.
  • Pirated, hacked, or copyright-infringing material.
  • Encouraging of others to engage in the above behaviors.


If a thread or post is found to contain any of the content outlined above, a moderator may choose to take one of the following actions:
  • Remove the Post or Thread - the content is removed from the forum.
  • Place the User in Moderation - all posts and new threads must be approved by a moderator before they are posted.
  • Temporarily Ban the User - user is banned from forum for a period of time.
  • Permanently Ban the User - user is permanently banned from the forum.


Moderators may also rename posts and threads if they are too generic or do not property reflect the content.

Moderators may move threads if they have been posted in the incorrect forum.

Threads/Posts questioning specific moderator decisions or actions (such as "why was a user banned?") are not allowed and will be removed.

The owners of Alpha Software Corporation (Forum Owner) reserve the right to remove, edit, move, or close any thread for any reason; or ban any forum member without notice, reason, or explanation.

Community members are encouraged to click the "Report Post" icon in the lower left of a given post if they feel the post is in violation of the rules. This will alert the Moderators to take a look.

Alpha Software Corporation may amend the guidelines from time to time and may also vary the procedures it sets out where appropriate in a particular case. Your agreement to comply with the guidelines will be deemed agreement to any changes to it.



Bonus TIPS for Successful Posting

Try a Search First
It is highly recommended that a Search be done on your topic before posting, as many questions have been answered in prior posts. As with any search engine, the shorter the search term, the more "hits" will be returned, but the more specific the search term is, the greater the relevance of those "hits". Searching for "table" might well return every message on the board while "tablesum" would greatly restrict the number of messages returned.

When you do post
First, make sure you are posting your question in the correct forum. For example, if you post an issue regarding Desktop applications on the Mobile & Browser Applications board , not only will your question not be seen by the appropriate audience, it may also be removed or relocated.

The more detail you provide about your problem or question, the more likely someone is to understand your request and be able to help. A sample database with a minimum of records (and its support files, zipped together) will make it much easier to diagnose issues with your application. Screen shots of error messages are especially helpful.

When explaining how to reproduce your problem, please be as detailed as possible. Describe every step, click-by-click and keypress-by-keypress. Otherwise when others try to duplicate your problem, they may do something slightly different and end up with different results.

A note about attachments
You may only attach one file to each message. Attachment file size is limited to 2MB. If you need to include several files, you may do so by zipping them into a single archive.

If you forgot to attach your files to your post, please do NOT create a new thread. Instead, reply to your original message and attach the file there.

When attaching screen shots, it is best to attach an image file (.BMP, .JPG, .GIF, .PNG, etc.) or a zip file of several images, as opposed to a Word document containing the screen shots. Because Word documents are prone to viruses, many message board users will not open your Word file, therefore limiting their ability to help you.

Similarly, if you are uploading a zipped archive, you should simply create a .ZIP file and not a self-extracting .EXE as many users will not run your EXE file.
See more
See less

Letting User Try Software for X number of Days before Purchase

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Letting User Try Software for X number of Days before Purchase

    The concept of "try before you buy" is used quite extensively by many companies and for a wide variety of things.

    In the past the approach was to allow the end user to use either a full version or limited version of the software for either a set number of days (like 30) or a set number of times to run the program before the person would buy (or stop using).

    I would like to internalize this in alpha without purchasing 3rd party software.

    Currently I have an opening window that pops up as the program is started and shows the user an update page on my website. On that web page I simply allow the user to look at the updates and then download and install if any are available.

    I want to internalize this opening page such that it shows how many days are left before the end-user must either purchase or the program stops running. Time restriction is optional but preferred. Number of runs could also serve as a similar limit. Than, assuming the restriction is enforced, a new window pops up that leads to the purchase "sales" page of the software.


    Any ideas on how one would accomplish this in alpha? Any feedback would be appreciated.

    Thanks,
    Wayne

    #2
    Re: Letting User Try Software for X number of Days before Purchase

    http://www.learn alpha.com/Licensing/Register.htm
    There can be only one.

    Comment


      #3
      Re: Letting User Try Software for X number of Days before Purchase

      Thanks for the quick reply. Will look it over shortly.

      Comment


        #4
        Re: Letting User Try Software for X number of Days before Purchase

        Depends how confident you are with Alpha.
        I have developed an automated licensing application in Alpha, so you can let it run and supply machine specific keys to a purchasor. It prevents the old "lift and shift" problem.
        No great leap of faith to have a couple of levels, like 30 days, 20 records etc.
        There are two elements in the process. 1 you build into your application, the other runs on your pc.
        Not complex, but you need a reasonable understanding of Alpha.
        Others will be able to provide licensing software for Alpha for a reasonable sum of cash, but it really is quite easy to do it yourself.
        See our Hybrid Option here;
        https://hybridapps.example-software.com/


        Apologies to anyone I haven't managed to upset yet.
        You are held in a queue and I will get to you soon.

        Comment


          #5
          Re: Letting User Try Software for X number of Days before Purchase

          Thanks for replies, Stan and Ted.

          I think I am still missing something. For example, I have a "sales page" and would like to process the payment (assuming a person wants to purchase it) via, say, PayPal. I can tell PayPal where to go to (url) for download but I would like to somehow automate the generation of the license number.

          The example Stan suggested was nice and one of the links on that page sort of addressed how to gen a key or serial number. View it at http://www.learn alpha.com/Licensing/Licensing.htm.

          But the question then becomes how to produce the key on the website for a specific individual purchase.

          I would not care to send a key to each individual that purchases the software because that would require me to react to every purchase within a reasonable amount of time, whatever that might mean.

          I would also not care to have a customer send a copy of their receipt to show proof of purchase before I issue a license number or serial number.

          I would like to automate this as much as possible without human interaction, if possible.

          Thanks for any and all comments and direction to proceed.

          Comment


            #6
            Re: Letting User Try Software for X number of Days before Purchase

            Wayne,

            I'm sure you have built a great application but I can almost guarantee you will not be overwhelmed to reply to emails to send out keys.

            If you are vary smart, you could write a script that runs when the the application on your machine, receives an email with say "Key" in the subject line, which is sent from within the application on their machine and then sends back the key with the value saved in your "Sales" app. This application would of course, have to be kept running the whole time.

            Something else you could look at is http://www.exeshield.com/ this will save you a whole load of time of codiing and testing.
            Regards
            Keith Hubert
            Alpha Guild Member
            London.
            KHDB Management Systems
            Skype = keith.hubert


            For your day-to-day Needs, you Need an Alpha Database!

            Comment


              #7
              Re: Letting User Try Software for X number of Days before Purchase

              It is not that hard. take some key from the new client's machine and turn it into a number within first start of alpha. Also multiply that number by a universal number like 8. Client's computer polls the website with his pre-key and the website gives him the actual key to enter like 48/8, he would have a key of 6. It would be much larger of course. If you wished to give a 30 days demo time, add a code to the end like 99 for 30 66 for 15 and so on.

              Alpha can read this stuff in an instant on startup. Once purchase is made, send an update that does not overwrite data without all the code in it, if you wish. but keep the code in the system that designates the computer so if it gets moved to another computer(copied), it won't work. Rather it wants you to get paid.
              Dave Mason
              [email protected]
              Skype is dave.mason46

              Comment


                #8
                Re: Letting User Try Software for X number of Days before Purchase

                You could always sell and get paid through Allstar Applications?
                You can put a free trial and a Premium product on the site quite easily.
                See our Hybrid Option here;
                https://hybridapps.example-software.com/


                Apologies to anyone I haven't managed to upset yet.
                You are held in a queue and I will get to you soon.

                Comment


                  #9
                  Re: Letting User Try Software for X number of Days before Purchase

                  Originally posted by DaveM View Post
                  It is not that hard.
                  Love ya Dave,
                  but I'm not agree with you here. Cal Locklin and Tom Cone have experience with this and might have some thoughts also, but I can share that my foray into integrating a trial period application component into a web download offering is that this process, to be done correctly, is complex. Not beyond a good developers reach, but complex. none the less. My partner and I on one application development ended up deciding to purchase a license to integrate an addin. Since then, 2 years ago now, I have, on the side, been playing with developing an addin of my own to use with future endeavors. Still developing that. Maybe I am not that bright, but a trial period component integrated into an application with licensing keys, time periods/run counts, alerts and redirects to websites to purchase if the time/run counts has lapsed is a complex endeavor. Anxiously waiting to hear the thoughts of others.
                  Mike W
                  __________________________
                  "I rebel in at least small things to express to the world that I have not completely surrendered"

                  Comment


                    #10
                    Re: Letting User Try Software for X number of Days before Purchase

                    Mike.
                    All the tools are in alpha to do this already. It just takes putting it together. You can get motherboard number, hard drive numbers, etc. change the characters to numbers, run the whole thing through remspecial() and you have a numeric string. That is basically what you use for the registration.

                    As far as time, I have one that runs for 90 days( long time, I know) it starts reminding at 60 days then 75 the every new date until 90 when it shuts down completely. all you can do is start and add the numeric code given to make it run. I actually take the long code after being sure it is long enough and multiply by 6

                    The only thing it does not do is auto register. I prefer a phone call with this particular application. all I do is divide what they send me by 6 for that one.

                    Yes, Mike, I know exactly how long it takes, but is not really the most complicated thing in alpha.

                    Time to construct with using help system, proper functions, a little reasoning power is about 3 days. The good part is that most of it is reusable to other apps you make. On second try, it can be done in one day.

                    With this system, if you copy the whole app to another computer you only ever see a registration form. No answer, then no run. The days to run are expired as well. The new "user" is forced to download a fresh copy. By using 90 days in my time to work, it allows a dealer to put in a whole lot of information and get used to a very large working environment. They do not want to start new with that process and do want to utilize their data.

                    My pay before you buy doe not have that system because I am paid before they use it.
                    Code:
                    dim global versionnumber as n
                    'make sure version is showing
                    versionnumber = a5_getappversionnumber()
                    
                    dim global mcar as c
                    dim global mdpath as c 'data path
                    dim global mepath as c 'exe path
                    dim global msysnme as c 'name of computer
                    dim global musername as c ' user name from computer
                    mdpath = a5.Get_Path() 
                    mdpath = alltrim(mdpath)
                    musername = API_GETUSERNAME()
                    musername = alltrim(musername)
                    mepath = a5.Get_Exe_Path()
                    mepath = alltrim(mepath)
                    msysnme = API_GETMACHINENAME()
                    
                    'we get stored data into variables.  We will check for differences and act accordingly.
                    dim global regepath as c
                    dim global regdpath as c
                    dim global reginstdate as d
                    dim global regexpire as d
                    dim global reglogdays as n
                    dim global regregnumb as n
                    dim global reganswer as n
                    dim global regfstart as L
                    dim global regpaid as l
                    dim global regmach as c
                    dim mymessage as c = "your copy of Race Car will expire on  " + dtoc(var->regexpire)
                    
                    'open the table and read it
                    dim tbl as P
                    tbl = table.open("regist",FILE_RO_SHARED)
                    query.description = "registrationget"
                    query.order = tbl.recno()
                    query.filter = "recno() = 1"
                    query.options = ""
                    qry = tbl.query_create()
                    regexpire = tbl.expire
                    reglogdays = tbl.logdays
                    reganswer = tbl.answer
                    regdpath = alltrim(tbl.datapath)
                    regepath = alltrim(tbl.exepath)
                    regmach = alltrim(tbl.machine)
                    regpaid = tbl.paidfull
                    regfstart = tbl.firststart
                    reginstdate = tbl.instdate
                    regregnumb = tbl.regnumb
                    tbl.close()
                    
                    dim mytesterc as c
                    dim global closestart as c
                    'dim mymessage as c = "your copy of Race Car will expire on  " + dtoc(var->regexpire)
                    
                    'select
                    	'not paid - no expire date and sys name is not a match or table is empty
                    	' makes a start so it is in 30 day mode
                    '	case var->regpaid <> .T. .and. alltrim(remspecial(dtoc(var->regexpire))) = "" .and. var->regmach <> var->msysnme 
                    '		dim tbl as p
                    '		tbl = table.open("regist",FILE_RW_EXCLUSIVE)
                    '		tbl.change_begin()
                    '		tbl.instdate = date()
                    '		tbl.expire = date() + 30
                    '		tbl.change_end()
                    '		tbl.close()
                    '		ui_msg_box("Expired","Your Have 30 days to enjoy for free.",UI_INFORMATION_SYMBOL)
                    '		form.view("start")
                    '	case var->regpaid <> .T. .and. var->regexpire - date() >0 .and. var->regmach =""
                    '		form.view("start")
                        'paid for and expire date is more than 0 days 	should expire in 2041  also system matches table
                    '	case var->regpaid = .T. .and. var->regexpire - date() > 0 .and. var->regmach = var->msysnme
                    '  		form.view("start")
                    '	case var->regpaid = .T. .and. var->regexpire - date() > 0  .and. var->regmach <> var->msysnme
                    '		ui_msg_box("Expired!", "this copy has expired due to system changes, you will go to the registration Form!" ,UI_NO_SYMBOL)
                    '  		form.view("registration")
                    '  	'not paid - expire is between 1 and 30 days - system matches 	
                    '    case var->regpaid <> .T. .and. var->regexpire - date() < 30 .and. var->regexpire - date() > 0 .and. var->regexpire - date() > 0 .and. var->regmach = var->msysnme 
                    '		form.view("start")
                    '    case var->regpaid <> .T. .and. var->regexpire - date() <= 0  .and. var->regmach = var->msysnme .or. var->regmach <> var->msysnme
                    '    	ui_msg_box("Expired","Your Application Has Expired.  You will now go to the Registration Form.",UI_INFORMATION_SYMBOL)
                    '    	form.view("registration")
                    'end select
                    This simple function needs to also be in the code:
                    FUNCTION getdays AS d (demotime as n, bdate as d)
                    'dim demotime as n = .09
                    dim edate as d
                    'dim bdate as d = date()
                    dim ndays as n


                    select
                    case demotime = 0.01
                    ndays = 7
                    case demotime = 0.02
                    ndays = 14
                    case demotime = 0.03
                    ndays = 30
                    case demotime = 0.06
                    ndays = 60
                    case demotime = 0.09
                    ndays = 90
                    case demotime = 0.08
                    ndays = 7300
                    case demotime <> 0.01 .or. demotime <> 0.02 .or. demotime <> 0.03 .or. demotime <> 0.06 .or. demotime <> 0.08 .or. demotime <> 0.09
                    ndays = - 10
                    end select

                    getdays = bdate + ndays

                    END FUNCTION
                    along with this script: onfirst
                    dim msysvar as c
                    dim global mexepath as c
                    dim global mdatapath as c
                    dim madded as c
                    dim many as n
                    dim global regist as n
                    dim startdate as d
                    dim enddate as d
                    dim regist2 as n
                    dim regist3 as n
                    dim normdate as d = date()
                    dim theenddate as d
                    dim filename as c = "c:\alda\racecar\zay.dll"
                    dim result as L
                    result = file.exists(filename)


                    if result = .T. then
                    file.rename("c:\alda\racecar\zay.dll", "c:\alda\racecar\regist.dbf")
                    end if


                    dim t as P
                    t = table.open("regist.dbf",FILE_RO_EXCLUSIVE)
                    t.fetch_last()
                    var->theenddate = t.enddate
                    t.close()

                    if normdate < theenddate then
                    goto C
                    else if normdate > theenddate then
                    goto A
                    end if


                    A: ' if the date has expired, we need to do this
                    'set the variables
                    'we need to call a ui to present the numbers and then divide by 8 and add the .03 or what ever.
                    'Create an XDialog dialog box to prompt for parameters.
                    DIM sysstuff as N = 3900000
                    DIM fillname as N
                    DIM ans as n
                    ok_button_label = "&OK"
                    cancel_button_label = "&Cancel"
                    theanswer = ui_dlg_box("Registration",<<%dlg%
                    {region}
                    This is the number to give when you call for the registration:| [%z%.40sysstuff];
                    Fill this in exactly as given to you:| [%z%.20fillname];
                    {endregion};
                    {line=1,0};
                    {region}
                    <15=ok_button_label!OK> <15=cancel_button_label!CANCEL>
                    {endregion};
                    %dlg%)

                    startdate = date()
                    mdatapath = a5.Get_Path()
                    mexepath = a5.Get_Exe_Path()
                    msysvar =API_GETMACHINENAME()
                    madded = mdatapath+mexepath+msysvar 'concatenates a5 path+a5 exe+machinename
                    madded = remspecial(madded) ' takes all the garbage out
                    many = ((len(madded)*8)+(len(mdatapath)*8))*800 'does some math on the answer and prepares it for div by 8
                    regist = round_down(many,0)/8 'rounds it all down

                    regist = regist+.03 '.03 for 60 days
                    regist2 = int(regist) 'gets it to an integer
                    regist3 = regist - regist2 'has to come out as 0.30 or always starts as 0.
                    enddate = getdays(regist3,startdate) 'function to change to the end date of registration

                    ' this reset the table to the variables above
                    tbl=table.open("regist",FILE_RW_SHARED)
                    tbl.enter_begin()
                    tbl.date = date()
                    tbl.enddate = var->enddate
                    tbl.datapath = var->mdatapath
                    tbl.exepath = var->mexepath
                    tbl.machine = var->msysvar
                    tbl.enter_end(.t.)
                    table.close()


                    C:

                    ' hide regist.dbf to zay.dll
                    dim filename as c = "c:\alda\racecar\regist.dbf"
                    dim result as L = file_exists(filename)

                    if result = .F. then
                    goto end
                    else
                    file.rename("c:\alda\racecar\regist.dbf", "c:\alda\racecar\zay.dll")
                    end if
                    end:
                    also script: regisafter
                    dim badwork as c
                    dim xxexpire as d
                    dim xxpaidfull as L
                    select
                    case var->mmand <> var->mmreg/6 .or. (var->mmlog <> 21 .and. var->mmlog <> 31 .and. var->mmlog <> 51)
                    badwork = "Y"
                    goto done
                    case var->mmand = var->mmreg/6 .and. var->mmlog = 51
                    xxpaidfull = .T.
                    xxexpire = ctod("12/31/2041")
                    badwork = "N"
                    case var->mmand = var->mmreg/6 .and. var->mmlog = 31
                    xxpaidfull = .f.
                    xxexpire = date() + 30
                    badwork = "N"
                    case var->mmand = var->mmreg/6 .and. var->mmlog = 21
                    xxpaidfull = .f.
                    xxexpire = date() + 15
                    badwork = "N"
                    end select
                    tbl = table.open("regist",FILE_Rw_EXCLUSIVE)
                    query.description = "stationget"
                    query.order = tbl.recno()
                    query.filter = ""
                    query.options = ""
                    qry = tbl.query_create()
                    tbl.change_begin()
                    tbl.instdate = date()
                    tbl.machine = var->msysnme
                    tbl.answer = var->mmand
                    tbl.logdays = var->mmlog
                    tbl.firststart = .t.
                    tbl.user = var->musername
                    tbl.datapath = var->mdpath
                    tbl.exepath = var->mepath
                    tbl.regnumb = var->mmreg
                    tbl.expire = xxexpire
                    tbl.paidfull = xxpaidfull
                    tbl.change_end(.T.)
                    tbl.close()

                    if badwork = "N" then
                    dim mess as c
                    mess = "Your Program will expire on " + var->xxexpire
                    ui_msg_box("Registered", var->mess ,UI_STOP_SYMBOL)
                    form.view("start")
                    end if
                    done:
                    if badwork = "N" then
                    goto last
                    else
                    form.view("registration")
                    end if
                    last:
                    I think that is enough to get started.
                    Last edited by DaveM; 05-04-2014, 01:35 AM.
                    Dave Mason
                    [email protected]
                    Skype is dave.mason46

                    Comment

                    Working...
                    X