We had a similar issue with Reddit, spent $500 and got a lot of clicks - none of them ever did anything else, not even by mistake. When we reported this behavior to Reddit, the rep who helped us set up the campaign just vanished. No answer. After a while, another rep came out and asked if we were interested in advertising on Reddit. Explained the situation and... poof! this other rep disappeared too.
My feeling is that this is systemic, and basically it's the very business model. I remember the first account explaining how the initial budget should be a few thousand dollars, so that "the AI could target effectively". It did target effectively - our wallet.
I've worked in different parts of the online ad industry for years. This is correct: fraud is a systemic and convenient part of the business model. The victims are the advertisers, who's in-house marketers don't know enough to detect/call out fraud.
Google itself forces advertisers into fraud-friendly products like PMAX. Then, when you detect the fraud, the hapless account rep says "ummm... maybe try using IP exclusion lists?" (Like one of the comments below). Google, with all the data it collects on people who click the ads, wants you to catch sophisticated fraud networks by manually building up IP blocklists. Yeah right.
And the victim of this entire ecosystem is your clever YC startup.
Has anyone ever had any success building a digital products business with pay-per-click ads? We're always tempted and dabble, and every bit of traffic seems accidental, completely disinterested or obviously a spammer clicking around trying to collect the "conversion".
Making PPC ads work is an enormous skill and some small business deciding to throw their keywords into Google Ad Manager is a sure fire way to lose your shirt. It is very, very, very hard to make a profit off PPC.
Yes, of course people have built a successful promotion engine with PPC. But if there was a repeatable method I could describe to you then, well, I'd be a very rich man!
I always recommend focusing on Sales first, and coming up with a steady, repeatable way to move people from "being aware of your product" to "deal won". With people. Manually.
Only then, when you have a sales funnel that's economically viable, you can start paying to bring more people into it through PPC.
As qingcharles commented, PPC is a fast easy way for big players and fraudsters to fleece you. There is a lot of domain knowledge to build on the path to effective PPC advertising. Here is one piece of practical advice: every ad network has an "opted-in by default" gotcha. Your job is to discover it before you give them a dollar. Sometimes it looks like "relax my targeting criteria for broader reach" that will bring in irrelevant visitors. Sometimes it is "also run my ads on partner sites/off network", those sites will have extreme fraud. Sometimes it looks like "automatically pick the right landing page URL to promote, so I don't have to think for myself" which will drive paid conversions to your Contact Us form.
PMAX is particularly awful because it incentivizes the scammers to actually book meetings with our Sales team, and waste their time with a no-show.
(For anyone unfamiliar with how the PMAX scam works: PMAX will send more ad traffic to sites that perform well for an advertiser. So scammers who own a network of fraudulent sites will fill out that advertisers' forms, register a great conversion rate, and get a lot of ad traffic directed to their network of bot sites. When you spot the fraud, Google will say: "um, maybe put their IPs on the ad blocklist?" like its 1998 and the most sophisticated click fraudsters are the ones who can click their mouse the fastest. Enshittification Endgame.)
I hope Reddit is not charging advertisers per ad video play.
As a mobile reddit user, I’ve noticed that the app treats ads differently than regular posts. They are more sensitive to taps than regular posts and I frequently accidentally trigger ad videos playing by scrolling past them but I never accidentally trigger regular videos.
I've seen this same thing on Instagram. Scrolling normally and then all of the sudden the latest advertiser's site is open. The only interaction they get is the close button. It can't be great for figuring if you're targeting potential sales correctly.
That's assuming you can get your ad seen, plenty of times I've seen Reddit's own ads for advertising on Reddit and I'll never see my ads. So I'm bidding against Reddit on Reddit's own platform.
Reddit is probably the worst of these ad platforms. We had a simple issue: we couldn't set the account that the ad was coming from to be the correct one (we have two Reddit accounts). That's it! So we sent a support email.
That was the beginning of 4, 45 mins sales calls, with full Powerpoint decks and on the spot commitments from us to reach, spend, etc. At the end of each call the rep would promise us that the account issue is escalated and will be fixed before we launch the campaign and would set the time for the next call.
3 weeks in, the account issue is still not fixed and frankly I cannot trust anything they say about their metrics, impressions, CTR or anything else.
I thought reddit would have been a sensible place to advertise our b2b product, that caters to a quite technical audience in a way that is not very friendly to Linkedin targeting.
As someone who used to use it a ton, Reddit is such a shadow of its former self that it's insane. It's actually like 90% bots. Their user growth numbers are all fake. The only real people on there are marketers making fake posts about an issue and commenting using alts and promoting a solution as a form of "AI engine optimization."
Give affiliates 15% commission for any successful sales they make. Then you don't have to think about marketing and you don't have to throw any money into a black hole.
You're asking me to write an entire book. Depends entirely on what you are selling. But the rule of thumb to get good quality partners is that you should contact them instead of the other way around. And if you know your business sector, then you know which are the people and institutions who have a lot of reach.
Some industries have standardized affiliate marketing which you don't have to think about. For example booking.com for hotels or Amazon for retail. They take a percentage of each sale they make for you and that's it. You don't pay them anything except for confirmed sales.
If you chose black hole paid advertising, then at a minimum you should give out different voucher codes on each channel you advertise on, which give customers a 10 or 15% discount. And give voucher codes to friends, family, colleagues and contacts that they can give to anybody they like. That's the only way to find out where the real customers are and where to target your ads.
> Importantly, our results show that once a given system of communication has evolved, it may constrain the evolution of more efficient communication systems because it would require going through a stage where communication between signalers and receivers is perturbed.
That is badly generalized proverb. Clojure has unhygienic macros, no expander extension points, and no error-message layer, so "don't" is a rational default there. Yet, for example Racket writes macros that write macros as a matter of course. And that's because the language has the infrastructure: hygiene by default, phase separation, `syntax-parse` with grammar-quality error messages, a module system that actually knows about compile-time dependencies.
But even with some limitations, there are cases in Clojure where macros do achieve things otherwise unattainable. One practical example is multi-host code generation. You can have a Clojurescript macro that parses and analyzes some javascript lib, doing that on JVM side, while emmiting code generated to run in Javascript. Hyperfiddle/Electric is the best example of that kind of macro ingenuity.
Or take core.async's `go`. It takes an arbitrary body, analyzes it into an AST, and rewrites it into a state machine so that <! and >! can park and resume. On the JVM it lets you avoid blocking threads. In Clojurescript it is the only way to have the model at all, because JS has no threads to block.
Nothing about that is expressible as a function. The transformation needs the entire body as data. Same family: core.match compiles a pattern matrix into a decision tree. And there are many more example use cases for macros.
"Don't write macros" rule has the second part: "unless you truly have no choice."
My own personal rule is that every Lisp programmer should understand macros and very rarely reach for them. They are a super-power, but easy to misuse. I think Paul Graham is partly responsible for the “Lisp = macros” thinking and the general overuse of them. On Lisp was a great book but it does lots of things I wouldn’t consider good practice today. After Graham popularized Lisp and macros, there was a period when every Lisp newbie, myself included, was writing macros all the time. Now that I’m older, I know better. Clojure is my daily driver and I haven’t written a macro in years (though I’ve debugged ones other people have written). But I know defmacro is there and I can use it anytime I really need to.
I don't think Paul ever envisioned Lisp evolving into something like Clojure, where macros indeed are a bit less than a first-class citizen. And I think the whole adage of "First rule of macro club - don't write macros. Second rule of macro club - don't dispute the first rule...", etc. became a thing only with Clojure. I don't disagree with you - genuine use cases for macros are uncommon. Yet it's an instrument - nothing's wrong with using it properly. Knowing when and how is a skill, experienced Lispers indeed - rarely reach for it.
Author here. I think in general this is sound advice, but in Emacs it is an incredibly convenient utility. I use them all the time. Mostly simple things like wrapping function definitions, or even other macros that wrap function definitions. Most of my lisp experience is in Emacs where the config layer is essentially exposed through an elisp API. In that context, I find myself using macros a lot. But if I was building some software from scratch, like say a data processing system, I can't immediately think of scenarios where I would define macros.
Worth mentioning in Elisp that even if you don't define your own macros, you use them more often than you would think. defun, unless, def-custom, etc (more examples in the blog post) are all macros. The fact they look and feel like non-macros like special forms and built in functions implemented in C is part of what makes elisp so cool to me. There are plenty of homoiconic languages, but you rarely feel the distinction between program and data in elisp, and macro-supporting lisps in general.
If you look at the definition of a macro like defcustom, you'll see that it just expands to a function call, where all the logic is implemented. This could also be implemented in the macro, but that is more complicated and brittle, due to the risk of double-evaluations and having to produce code that will (usually) later evaluate with the intended side effect.
Furthermore, macros and functions constitute a kind of function coloring. To use a macro in a function, like defcustom, you couldn't pass the name of the user option you are defining in as a symbol, as that is not evaluated. So instead you'd have to call eval on a runtime constructed expression, which is a cludge.
So I agree with the top comment, to avoid macros is a sign of Lisp maturity. It is easy and fun to admire them when you are coming from languages with arbitrary restrictions in their macro systems like C, but ones you get used to them you don't treat them with any more wonder than any other arbitrary restriction that a language may lack (bad ad hoc example: nobody praises C for the lack of a CALL keyword).
I agree! A Lisp coder should define a new macro only rarely. Junior coders should avoid doing it altogether.
Macros make Lisp code hard to read. Every time I see a call to define-minor-mode, a groan a little: that macro saves about 5 tokens (relative to just writing out code involving only functions everyone knows) at the cost of making me bounce back and forth at least 3 times between (a buffer showing) define-minor-mode's doc string and the call.
Could you explain why Paul Graham's book "On Lisp" is wrong? Or misguided? Or misunderstood by newbies like me? 30 years of c++ with a lot of dealing with templates and I'm not feeling the mandatory function purity here.
I don't think that is a reasonable request for a response to a comment post, but in my experience, many lisp macro advocates come from other procedural / OO languages and aren't well acquainted with other programming paradigms, so they don't generally know what the don't know about other styles, say functional programming, and how to solve problems using higher order functions, etc. instead of reaching for macros. Which is OK. Not everyone has to become a programming language dilettante.
Meh, that seems to be a bit of a clojure thing. In the Racket world, with hygienic macros and phase separation, they'll routinely write macros returning macros, etc.
Macros returning macros happens in every Lisp, including Clojure. It’s no biggie. Hygiene has nothing to do with it and there are ways of properly managing unique symbols in all Lisps, even if some dialects are more manual than in Scheme/Racket.
I know, but the point is that in Clojure there's a bit of a culture of not writing macros unless you have to, while in Racket there's no such thing. Agreed that you can write macros just fine in other lisps.
The Clojure community is definitely less macro-crazy than other Lisp communities. But it’s also very programmer-specific. I’ve worked on OSS Clojure code where the original programmer loved macros. In general, I found it more annoying because reading through recursive macros is just more difficult than reading a simple function. So, I think it’s better for the community to de-emphasize macros, in general. Even if I want back to programming in CL or Scheme/Racket, I think I’d be much more judicious about using macros. Again, nothing against macros in general. They are a powerful tool in Lisp. But, to quote Spider-Man, with great power comes great responsibility.
I find it very useful to talk to my dog. When I have a problem I'm banging my head against, just explaining it to him from first principles makes my head "click". When that works, his dog treats are billed as "consulting".
The anti-nuclear area, at least in Western Europe, had historically a very high correlation with those who held sympathies for a certain very large nuclear power who would have strategically benefited from an anti-nuke sentiment that would avoid another nuclear power's weapon deployment in EU bases. But I'm sure it is a coincidence.
My feeling is that this is systemic, and basically it's the very business model. I remember the first account explaining how the initial budget should be a few thousand dollars, so that "the AI could target effectively". It did target effectively - our wallet.
reply