Given that your objective is to determine which, if any, of the three messages is best, I'd skip the $\chi^2$, which merely tests for differences. If two messages are equally good and substantially better than the third, the $\chi^2$ will (hopefully) return a significant result, but you won't have learned all that you want to.
An alternative is the parametric bootstrap. Using the example in the comments above, we have three samples of size $1000$ which we can model as drawn from Binomial distributions with $n=1000$ and unknown probabilities. We estimate the probabilities by the three observed frequencies and generate a large number ($B = 10,000$, for example) of draws from each of the three Binomial distributions. We then compare the three draws for $b=1, 2, \dots, B$, identifying which is the largest, and report the resulting frequencies:
# Observed data
n <- 1000
observed_counts <- c(75, 50, 50)
# Estimate probabilities
p <- observed_counts / n
# Generate 10,000 samples for each message
x1 <- rbinom(10000, n, p[1])
x2 <- rbinom(10000, n, p[2])
x3 <- rbinom(10000, n, p[3])
# Count the frequency with which each is best
best <- ifelse(x1 > x2, ifelse(x1 > x3, 1, 3),
ifelse(x2 > x3, 2, 3))
with the result:
> table(best)
best
1 2 3
9778 106 116
Message 1 was best 97.78% of the time, corresponding to a p-value of 0.0222, roughly the same as the p-value of the $\chi^2$ test given in comments above (0.028).
However, consider a situation with observed frequencies of 7.5%, 7.5%, and 5%. The bootstrap returns:
# Observed data
n <- 1000
observed_counts <- c(75, 75, 50)
...
> table(best)
best
1 2 3
4823 5157 20
which makes it quite clear that, although message 3 is worse, messages 1 and 2 are not significantly different. The $\chi^2$ test, on the other hand, returns a p-value of 0.0439, not as helpful a result!